最長公共子串行
(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 三種情況更新過來,取個最大的...