2015-09-27 44 views
0

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

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

Output

#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; 
} 

回答

0

如果你把lcs函数的开始一个破发点,你会看到,的确是第输出Last characters B & Bare equal

我想你在终端上看不到的原因是由于输出中的行限制。如果您在追踪添加评论时需要任何帮助,我会编辑我的帖子以覆盖跟踪。

0

你的程序工作正常,虽然有些问题仍然存在。

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

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

例如,在你的输出:Last characters G & Gare equal应该是实际Last characters G & G are equal

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