最長公共子串行問題以及揹包問題都是dp(動態規劃)演算法的經典題目,值得深度挖掘以致了解dp演算法思想。
問題如下:
時間限制:
3000 ms | 記憶體限制:
65535 kb
難度:3 描述
咱們就不拐彎抹角了,如題,需要你做的就是寫乙個程式,得出最長公共子串行。
tip:最長公共子串行也稱作最長公共子串(不要求連續),英文縮寫為lcs(longest common subsequence)。其定義是,乙個序列 s ,如果分別是兩個或多個已知序列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。
輸入第一行給出乙個整數n(0
輸出每組測試資料輸出乙個整數,表示最長公共子串行長度。每組結果佔一行。
樣例輸入
2樣例輸出asdf
adfsd
123abc
abc123abc
3演算法分析:根據題意,我們需要找出任意兩個字串中相同的最長序列(不需要1對1完全相同),那麼就題中的第一組資料,我們可以起於a也可以起於d或者f,這有著多種不同的情況,所以需用動態規劃解決問題,對於lcs可能包含在s與ti-1,也可能存在於si-1與ti中,抑或si與ti之間,這使得我們意識到最後乙個相同點就是解題的出發點,存在二種情況:6
若s1[i]==s2[j], dp[i][j] = dp[i-1][j-1]+1否則,dp[i][j] = max(dp[i-1][j], dp[i][j-1])
得到dp方程為
一維dp**如下:
#include #include using namespace std;
char s1[1001], s2[1001];
int dp[1001], t, x, y;
int main()
} cout二維dp**如下:
#include #include #define max 1000
int dp[max+1][max+1];
char s[max],t[max];
int max(int a,int b)
int main()
{ int n,i,j,n,m;
scanf("%d",&n);
while(n--)
{ scanf("%s%s",s,t);
int x=strlen(s),y=strlen(t);
for(i=0;i
DP 最長公共子串行 LCS
題目 poj 1458 題目簡述 求兩個字串的最長公共子串行的長度。題目分析 這是一道經典的lcs問題,用dp來解決。include include include define mem x memset x 0,sizeof x define maxn 10 1000 using namespac...
dp 最長公共子串行 LCS
給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行。乙個字串的 子串行 是指這樣乙個新的字串 它是由原字串在不改變字元的相對順序的情況下刪除某些字元 也可以不刪除任何字元 後組成的新字串。例如,ace 是 abcde 的子串行,但 aec 不是 abcde 的子串行。兩個字串的...
dp 最長公共子串行(LCS)
字串行 與 字元字串的區別 序列是可以不連續的字串 字串必須要是連續的 問題描述 給定兩串字串 abcde 和 acdf 找出 2 串中相同的字串行,觀察知 相同的字串行為 acd 方法一 暴力解決 對於乙個長度為 n 的串 它的字串總共有 2 n 個,在用著 2 n 個字串與另乙個長度為 m 的串...