【发布时间】: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;
}
【问题讨论】: