2015-09-27 39 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)它不是動態規劃實現。你可能知道這是蠻力。