最長公共子串行問題 動態規劃

2021-07-23 12:01:18 字數 855 閱讀 3862

給定兩個字串s1s2...sn和t1t2...tn。求出這兩個字串最長的公共子串行

輸入:abcicba

abdkscab

輸出:abca

定義dp[i][j]為s1…si和t1…tj對應的lcs的長度

s1…si+1和t1…tj+1對應的公共子列有三種情況:

①當si+1= tj+1時,在s1…si和t1…tj的公共子列末尾追加上si+1

②s1…si和t1…tj+1的公共子列

③s1….si+1和t1…tj的公共子列

所以有dp[i+1][j+1] = max(dp[i][j]+1,dp[i][j+1], dp[i+1][j])   (si+1=tj+1)

= max(dp[i][j+1], dp[i+1][j])

dp[n][m]就是lcs的長度

然後從後往前判斷lcs中的字元即可

#include #include #include using namespace std;

char a[1003], b[1003], c[1003];

int dp[1003][1003];

int main()

int i = n, j = m, k = dp[n][m];

c[k--] = '\0';

while (i & & j)

else if (dp[i][j-1] > = dp[i-1][j])

j--;

else

i--;

}cout << c << endl;

}return 0;

}

動態規劃 最長公共子串行問題

最長公共子串行問題 longest common subsequence problem 簡稱lcs問題。題目為給定兩個序列x y求它們的lcs 最長公共子串行 這裡的子串行z的定義為 z中的元素既在x中也在y中,並且他們在x y中滿足嚴格的下標為乙個增序列 假設下標從左到右依次增大 另外,不要求z...

最長公共子串行問題(動態規劃)

time limit 1000ms memory limit 65536kb problem description 給定兩個序列x input 輸入資料有多組,每組有兩行 每行為乙個長度不超過500的字串 輸入全是大寫英文本母 a,z 表示序列x和y。output 每組輸出一行,表示所求得的最長公...

動態規劃 最長公共子串行問題

動態規劃d題 題目 include define n 500 includeint main 初始化首列陣列c的第1列是0 for j 0 j len2 j 初始化首行陣列c的第1行是0 for i 1 i len1 i 動態規劃 for j 1 j len2 j 比較x的第i個元素與y的第j個元素...