最長公共子串行比較經典的動態規劃問題。時間限制:3000 ms | 記憶體限制:65535 kb
難度:3
描述 咱們就不拐彎抹角了,如題,需要你做的就是寫乙個程式,得出最長公共子串行。
tip:最長公共子串行也稱作最長公共子串(不要求連續),英文縮寫為lcs(longest common subsequence)。其定義是,乙個序列 s ,如果分別是兩個或多個已知序列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。
輸入 第一行給出乙個整數n(0< n< 100)表示待測資料組數
接下來每組資料兩行,分別為待測的兩組字串。每個字串長度不大於1000.
輸出 每組測試資料輸出乙個整數,表示最長公共子串行長度。每組結果佔一行。
樣例輸入
2 asdf
adfsd
123abc
abc123abc
樣例輸出 3 6
使用動態規劃,最主要的步驟是要分析出子問題及其重疊問題來。
對於此題,每一組字串的長度 對於 尋找最長子序列的方法,並不會產生什麼影響。例如長度為4、6與8、10的兩組字串,它們分別尋找最長子序列的方法並沒有什麼本質區別。正是因為這個原因,我們可以把n、m長度的字串問題可以劃分為n-1、m-1長度的問題,甚至還可以繼續劃分,這樣實際上就產生了m+n個子問題(因為每次都是m或者n減去1而產生乙個子問題),但是在這些子問題中,有很多重複地子問題,所以如果用遞迴解得話,會做很多重複地工作。更簡單的方式是採用乙個二維陣列lcs[m][n]來記錄所有可能的m、n取值組合下的最長公共子串行長度。
進一步分析,如何描述子問題?要分兩種情況。
第一,如果str1[m]=str2[n]的情況下,最長公共子串行長度應該就是m-1、n-1長度的字串組的最長公共子串行長度加上1。用公式表示就是lcs[m][n]=lcs[m-1][n-1]+1。
第二,如果str1[m]!=str2[n]的情況下,最長公共子串行長度應該在m-1、n 以及 m、n-1 這兩個子問題之中最大公子序列長度的大者。用公式表示就是lcs[m][n]= max ( lcs[m-1][n] , lcs[m][n-1] )。
**如下:
#include
#include
int main()
}printf("%d\n",lcs[len1][len2]);
}}
動態規劃 最長公共子串行
問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上公升的序列 i1,i2,ik 使得對j 1,2,k,有xij zj。比如z a,b,f,c 是x a,b,c,f,b,c 的子串行。現在給出兩個序列x和y,你的任務是找到x和y的最大公共子串行,也就是說要...
動態規劃 最長公共子串行
兩個序列的最長公共子序 lcs longest common length 的 每個字元可以不連續,如x y 那麼它們的最長公共子串行為。這是乙個經典的動態規劃問題,著手點還是找到 最精髓的 狀態轉移方程 假設x,y兩個序列的前i,j個位置的最大子串行已經找到為r i j 自底往上 那麼x i 與y...
動態規劃 最長公共子串行
看完演算法導論關於這部分內容之後的總結 關於最長公共子串行問題 給定兩個子串行 x y 求x和y長度最長的公共子串行。解決方法 首先先要了解lcs的最優子結構,令x y 為兩個子串行,z 為x和y的任意lcs。1 如果 xm yn 則 zk xm yn 且 zk 1 是 xm 1 和 yn 1 的乙...