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 1000intx[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 1000intx[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...