定義:longset common subsequence(lcs).給定兩個序列x和y,如果z既是x的乙個子串行又是y的乙個子串行,稱序列z是x和y的公共子串行
lcs的最優子結構: 設x
=,y=
x =,
y=
,z=z
=為x和y的乙個子串行,
1. 若xm
=yn xm=
yn
,則zk
=xm=
ynz k=
xm=y
n且zk
−1z k−
1是xm
−1x m−
1和yn
−1y n−
1的乙個lcs;
2. 若xm
≠yn xm≠
yn
,則zk
≠xm zk≠
xm
且zk−1
z k−
1是xm
−1x m−
1和yn
y
n的乙個lcs;
3. 若xm
=yn xm=
yn
,則zk
≠yn zk≠
yn
且zk−1
z k−
1是xm
x
m和yn
−1y n−
1的乙個lcs;
由此可得動態規劃公式: dp
[i,j
]=⎧⎩
⎨0,i
fi=0
orj=
0dp[
i−1,
j−1]
+1,i
fi,j
>0a
ndxi
=yjm
ax(d
p[i−
1,j]
,dp[
i,j−
1]),
ifi,
j>0a
ndxi
≠yj dp[
i,j]
=;
const int n = 10001;//這裡假設字串長度不超過10001
int dp[n][n];//記錄從dp[0][0]到dp[i][j]的lcs長度
int path[n][n];//記錄從dp[0][0]到dp[i][j]的路徑,以便列印出最長子序列
int lcs(string s1, string s2)
else
else}}
}return dp[n1][n2];
}void printlcs(string s1, string s2, int i, int j)
//這代表s1[i-1] = s2[j-1]是lcs中的乙個元素
if (path[i][j] == upleft)
else if (path[i][j] == up)
else
}int main(void)
LCS 最長公共子串行
問題描述 我們稱序列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最長公共子串行
求兩個字串的最大公共子串行問題 子串行的定義 若給定序列x 則另一串行z 是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j 1,2,k有 zj xij。例如,序列z 是序列x 的子序列,相應的遞增下標序列為。分析 用動態規劃做 1.最長公共子串行的結構 事實上,最長公共子串行問題具有最優子結構...
LCS最長公共子串行
lcs是longest common subsequence的縮寫,即最長公共子串行。乙個序列,如果是兩個或多個已知序列的子串行,且是所有子串行中最長的,則為最長公共子串行。複雜度對於一般的lcs問題,都屬於np問題。當數列的量為一定的時,都可以採用動態規劃去解決。解法動態規劃的乙個計算最長公共子串...