動態規劃1 最長公共子串行

2021-09-07 11:55:13 字數 2316 閱讀 2691

經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並

綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。

為了節約重複求相同子問題的時間,引入乙個陣列,不管它們是否對最終解有用,把所有子問題的解存於該陣列中,這就

是動態規劃法所採用的基本方法。

遞推公式的推導

遞推公式的證明方法

**的寫法:把遞推公式直接寫進**即可

給出兩個字串,求出這樣的乙個最長的公共子串行的長度:子串行中的每個字元都能在兩個原串中找到,而且每個字元的先後順序和原串中的先後順序一致。

2、證明

s1[i-1]!= s2[j-1]時,maxlen(s1,s2)不會比maxlen(s1,s2j-1)

和maxlen(s1i-1,s2)兩者之中任何乙個小,也不會比兩者都大。

(1)不比任何乙個小:maxlen(s1,s2)字串長於後兩者

(2)也不會比兩者都大:反證法,假設比兩者都大:

若maxlen(s1,s2)比maxlen(s1,s2j-1)大,說明s2(j)這個字元與s1中的字元相等,並且s2(j)和這個相等的字元是最長公共子串行的最後乙個。

若maxlen(s1,s2)比maxlen(s1i-1,s2)大,說明s1(i)這個字元與s2中的字元相等,並且s1(i)和這個相等的字元是最長公共子串行的最後乙個。

上面兩種情況都是最長公共子串行的最後乙個,而這個最長公共子串行是maxlen(s1,s2)的最長公共子串行,所以最後乙個要相等。

那會得出s1[i]== s2[j]的結論,與假設衝突。

1/*2

最長公共子串行

31、遞推公式:

4(分最後乙個相同和最後乙個不同來分析)

5當i或j等於0,maxlen(i,j)==0;

6當s1和s2的最後乙個字元相同時,maxlen(i,j)=maxlen(i-1,j-1)+1;

7當s1和s2的最後乙個字元不同時,maxlen(i,j) = max(maxlen(i,j-1),maxlen(i-1,j) );

82、證明

9s1[i-1]!= s2[j-1]時,maxlen(s1,s2)不會比maxlen(s1,s2j-1)

10和maxlen(s1i-1,s2)兩者之中任何乙個小,也不會比兩者都大。

11(1)不比任何乙個小:maxlen(s1,s2)字串長於後兩者

12(2)也不會比兩者都大:反證法,假設比兩者都大,那會得出s1[i-1]== s2[j-1]的結論,與假設衝突

133、**

14直接寫遞推公式就好了

15*/

16/*

17錯誤一:結果不對

18for(j=1;j<=length2;j++),漏了等號,所以都沒執行到這來,所以結果不對

19*/

20 #include 21 #include 22

using

namespace

std;

23char sz1[1000];//

字元陣列1

24char sz2[1000];//

字元陣列2

25int maxlen[1000][1000

];26

//maxlen(i,j)表示s1的左邊i個字元形成的子串,

27//

與s2左邊的j個字元形成的子串的最長公共子串行的長度(i,j從0開始算)

動態規劃 最長公共子串行

問題描述 我們稱序列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 的乙...