最長公共子串行問題 最長公共子串問題 動態規劃

2022-06-29 17:09:16 字數 1638 閱讀 1121

longest common subsequence problem

序列x和y,找到z為x和y的最大公共子串行

蠻力列舉

從x的長度為1序列開始列舉,在y中查詢是否有該序列

列舉觀察,長度為x-1的子串行是長度為x的子串行的一部分

存在最優子結構和重疊子問題,適合動態規劃

1、問題結構分析

c[i,j]記錄x[1..i]和y[1..j]的最長公共子串行長度

2、通過考察末尾元素來尋找遞推關係

有xi=yj和xi≠yj兩種情況

xi≠yj時,c[i,j]= max(c[i-1,j],c[i, j-1])

xi=yj時,c[i,j]=max(c[i-1, j-1]+1,c[i-1, j],c[i,j-1])

由於c[i-1, j-1]+1>=max

則 xi=yj時,c[i,j]= c[i-1, j-1]+1

3、自底向上計算:確定計算順序

初始化 c[i,0]=c[0,j]=0

遞推公式 得出計算順序自上而下自左而右

4、追蹤陣列rec[i,j]=lu / u/ l

時間複雜度o(n*m),n、m分別為序列x、y的長度

#include#define max 1000

intx[max], y[max], z[max][max], rec[max][max];

intxl, yl;

intlongestsub()

else

if(z[i-1][j]>=z[i][j-1

])

else}}

return

z[xl][yl];

}void printsub(int i, int

j)

else

if(rec[i][j]==2) printsub(i-1

, j);

else printsub(i, j-1);}

intmain()

longest common substring problem

蠻力列舉觀察知

存在最優子結構和重疊子問題,適用動態規劃

c[i,j]表示x[1..i]和y[1..j]中,以 xi和yj結尾的最長公共子串 z[1..l]的長度

xi≠yj時,c[i][j]=0

xi=yj時,c[i][j]=c[i-1][j-1]+1

初始化 c[i,0]=c[0,j]=0

遞推式自上而下自左而右計算

追蹤最優方案

最長公共子串末尾位置pmax,最長公共子串長度lmax

#include#define max 1000

intx[max], y[max], c[max][max];

int xl, yl, pmax=0, lmax=0

;void

longestsubstr()

}else c[i][j]=0

; }

}return;}

intmain()

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...

最長公共子串行 最長公共子串

1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...

最長公共子串 最長公共子串行

子串要求連續 子串行不要求連續 之前的做法是dp求子序列 include include include using namespace std const int inf 0x3f3f3f3f const int mod 1000000007 string s1,s2 int dp 1010 10...