最長公共子串行 DP

2021-06-21 22:06:16 字數 1284 閱讀 6452

最長公共子串行

(lcs.pas/c/cpp)

【問題描述】

乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列。確切地說,若給定序列x= < x1, x2,…, xm>,則另一串行z= < z1, z2,…, zk>是x的子串行是指存在乙個嚴格遞增的下標序列 < i1, i2,…, ik>,使得對於所有j=1,2,…,k有 xij=zj

例如,序列z=是序列x=的子串行,相應的遞增下標序列為<2,3,5,7>。給定兩個序列x和y,當另一串行z既是x的子串行又是y的子串行時,稱z是序列x和y的公共子串行。例如,若x=< a, b, c, b, d, a, b>和y= < b, d, c, a, b, a>,則序列是x和y的乙個公共子串行,序列也是x和y的乙個公共子串行。而且,後者是x和y的乙個最長公共子串行,因為x和y沒有長度大於4的公共子串行。

給定兩個序列x= < x1, x2, …, xm>和y= < y1, y2, … , yn>,要求找出x和y的乙個最長公共子串行。

【輸入檔案】

輸入檔案共有兩行,每行為乙個由大寫字母構成的長度不超過200的字串,表示序列x和y。

【輸出檔案】

輸出檔案第一行為乙個非負整數,表示所求得的最長公共子串行的長度,若不存在公共子串行,則輸出檔案僅有一行輸出乙個整數0,否則在輸出檔案的第二行輸出所求得的最長公共子串行(也用乙個  大寫字母組成的字串表示。

【輸入樣例】

abcbdab

bdcba

【輸出樣例】

4 bcba

【提交鏈結】

#include 

#include

#include

#include

using namespace std;

char s1[201]=,s2[201]=;

char opt[201][201][201]=;

int maxlen[201][201]=;

int main()

s1[0]='\0';

for (i=m-1;i>=0;i--)

s2[0]='\0';

memset(maxlen,0,sizeof(maxlen));

for(i=1;i<=n;i++)

else if (maxlen[i][j-1]>maxlen[i-1][j])

else}}

printf("%s\n",opt[n][m]);

printf("%d\n",maxlen[n][m]);

return0;

}

DP 最長公共子串行

解題報告 題目 演算法 dp 最長公共子串行 思路 最長公共子串行,英文縮寫為lcs longest common subsequence 其定義是,乙個數列 s 如果分別是兩個或多個已知數列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。d i j 表示s1的第i位...

最長公共子串行 DP

有序子串行定義 若x 則它的子串行為y 即原序列調出若干項組成的序列且下標要求有序。lcs 最長公共子串行 定義 給定兩個序列x 和y 存在乙個嚴格遞增的x的下標序列為,對所有的j 1,2,3.k,滿足xi yj,例如x 1 4 3 2 5 y 4 3 5 7 則x和y的最長公共子串行為 4 3 5...

最長公共子串行 DP

演算法老師的作業,一道dp基礎題,給你兩個序列,問你最長公共子串行是什麼,比如 a,b 是 a,c,d,b 的子串行。注意不是最長公共子串,這裡的子串行可以不連續。兩個for迴圈就出來了,每乙個dp i j 可以從dp i 1 j 1 dp i 1 j dp i j 1 三種情況更新過來,取個最大的...