動態規劃 最長公共子串行

2021-06-23 01:58:01 字數 1126 閱讀 3043

兩個序列的最長公共子序

lcs(longest common length)的

每個字元可以不連續,

如x=,y=,那麼它們的最長公共子串行為。這是乙個經典的動態規劃問題,著手點還是找到

最精髓的

狀態轉移方程

。假設x,y兩個序列的前i,j個位置的最大子串行已經找到為r[i][j]

(自底往上)

,那麼x[i] 與y[j+1]的lcs就只要考慮一下兩種情況:x[i] =

y[j+1] 和

x[i] !=

y[j+1] ;

若xi=

yj ,

那麼最長公共序列為maxlen(xi-1 , yj-1) + 1;若xi !=

yj ,那麼最長公共序列為maxlen(xi-1 ,yj)和maxlen(xi ,yj-1)中的最大值,具體如下:

根據下面的**可以看出,每一列的數字最多增加1(當找到乙個相同符號),乙個字母只有當它前面的字母找到匹配時,它的增加才可能成為主路徑。最後結果一定會累加到最後乙個**中

如果要尋找兩個序列的最長公共子串,即連續相等的子串行,看起來有點麻煩,但只需將上面的狀態方程x[i] !=

y[j]改為c[i,j]=0即可。

這個圖跟上面的圖的區別就在於沒有水平路徑,只有斜對角線上相等的元素才能加1,其實就是要連續匹配的元素(i, j)與(i+1, j+1)才滿足要求。

**如下:

int lcs_dp(string a, string b, int l1, int l2)

; int len=0;

int i,j;

for(i=0; ilen) len=r[i+1][j+1];

} }return len;

}

動態規劃 最長公共子串行

問題描述 我們稱序列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的最大公共子串行,也就是說要...

動態規劃 最長公共子串行

看完演算法導論關於這部分內容之後的總結 關於最長公共子串行問題 給定兩個子串行 x y 求x和y長度最長的公共子串行。解決方法 首先先要了解lcs的最優子結構,令x y 為兩個子串行,z 為x和y的任意lcs。1 如果 xm yn 則 zk xm yn 且 zk 1 是 xm 1 和 yn 1 的乙...

動態規劃 最長公共子串行

題目大意不再贅述,即判斷兩個字串,求出字串中最長的公共子串行。這是動態規劃的經典題目。include iostream include cstring using namespace std char sz1 1000 abcfbc char sz2 1000 abfcab int maxlen 1...