LCS 最長公共子串行(DP經典問題)

2021-06-23 03:19:54 字數 1374 閱讀 7121

最長公共子串行問題以及揹包問題都是dp(動態規劃)演算法的經典題目,值得深度挖掘以致了解dp演算法思想。

問題如下:

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:3 描述

咱們就不拐彎抹角了,如題,需要你做的就是寫乙個程式,得出最長公共子串行。

tip:最長公共子串行也稱作最長公共子串(不要求連續),英文縮寫為lcs(longest common subsequence)。其定義是,乙個序列 s ,如果分別是兩個或多個已知序列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。

輸入第一行給出乙個整數n(0

輸出每組測試資料輸出乙個整數,表示最長公共子串行長度。每組結果佔一行。

樣例輸入

2

asdf

adfsd

123abc

abc123abc

樣例輸出

3

6

演算法分析:根據題意,我們需要找出任意兩個字串中相同的最長序列(不需要1對1完全相同),那麼就題中的第一組資料,我們可以起於a也可以起於d或者f,這有著多種不同的情況,所以需用動態規劃解決問題,對於lcs可能包含在s與ti-1,也可能存在於si-1與ti中,抑或si與ti之間,這使得我們意識到最後乙個相同點就是解題的出發點,存在二種情況:

若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 的串...