【问题标题】:Step-wise output of Longest Common Sub-sequence program makes no sense to me最长公共子序列程序的逐步输出对我来说毫无意义
【发布时间】:2015-09-29 06:14:23
【问题描述】:

我是动态编程的新手,我编写了一个程序来使用动态编程找到最长的公共子序列,但是为了更好地理解 DP,我认为在我的递归函数中打印每个 if-else 条件的结果是个好主意,但是输出对我来说毫无意义。

例如,第一个输出是“现在 m 和 n 都为 0”,但为什么呢?不应该是“最后一个字符 B 和 B 相等”吗?我确定编译器使用了一些我不知道的逻辑,但我真的很想知道实际发生了什么!

#include<iostream>
#include<cstring>
using namespace std;

int max(int a, int b)
{
    return (a > b) ? a : b;
}

int lcs(char *X, char *Y, int m, int n)
{
    if (m == 0 || n == 0)
    {
        cout << " Now m and n both are 0" << endl;
        return 0;
    }

    if (X[m - 1] == Y[n - 1])// last character same
    {
        cout << " Last characters " << X[m - 1] << " & " << Y[n - 1] << "are equal " << endl;
        return (1 + lcs(X, Y, m - 1, n - 1)); // add 1 + computer for rest
    }
    else
    {
        cout << " Last characters " << X[m - 1] << " & " << Y[n - 1] << "are unequal " << endl;
        return max(lcs(X, Y, m, n - 1), lcs(X, Y, m - 1, n));
    }
}


int main()
{
    char X[] = "AGGTAB";
    char Y[] = "GXTXAYB";
    int m = sizeof(X)-1;
    int n = sizeof(Y)-1;

    cout << " LCS length is " << lcs(X, Y, m, n) << endl;

    int a;
    cin >> a;
}

【问题讨论】:

    标签: c++ dynamic-programming


    【解决方案1】:

    如果您在lcs 函数的开头放置一个断点,您会看到第一个输出确实是Last characters B &amp; Bare equal

    我认为您在终端中看不到它的原因是输出中的行限制。如果您在追踪方面需要任何帮助,请添加评论,我将编辑我的帖子以涵盖追踪。

    【讨论】:

      【解决方案2】:

      您的程序运行正常,但仍然存在一些问题。

      1) 检查mn 应该小于0,不等于它应该从size_of_array - 10

      2) 在std::cout 中打印值前后添加一个空格。

      例如,在您的输出中:Last characters G &amp; Gare equal 实际上应该是 Last characters G &amp; G are equal

      3) 它不是动态编程实现。你可能知道这是蛮力。

      【讨论】:

        猜你喜欢
        • 2022-01-10
        • 2015-06-19
        • 1970-01-01
        • 2011-03-01
        • 2011-02-25
        • 2013-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多