这个问题在做子问题的一些界定的时候,也是很自然的想到把原序列剪短一点点
问题:给定序列
X=<x1,x2,……,xm>
Y=<y1,y2……,yn>
求X和Y的最长公共子序列
一、实例
X:A B C B D A B
Y:B D C A B A
最长公共子序列:B C B A,长度4
二、蛮力算法
不妨设 m 小于等于 n,|X| = m,|Y| = n
算法:依次 检查 X 的每个子序列在 Y 中是否出现
时间复杂度:
每个序列O(n)的时间
X有2^m个子序列
最坏情况下时间复杂度:O(n2^m)
三、子问题的界定
参数 i 和 j 界定子问题
X 的终止位置是 i,Y 的终止位置是 j
Xi =<x1, x2, …, xi>,Yj =<y1, y2, …, yj>
四、算法
算法 LCS (X, Y, m, n)
1. for i¬1 to m do C[i,0] ¬ 0
2. for i¬1 to n do C[0,i] ¬ 0
3. for i¬1 to m do
4. for j ¬1 to n do
5. if X[i]=Y[j]
6. then C[i, j] ¬C[i-1,j-1]+1
7. B[i, j] ¬"ã"
8. else if C[i-1, j] ³ C[i,j-1]
9. then C[i, j]¬C[i-1,j]
10. B[i, j]¬""
11. else C[i, j]¬C[i,j-1]
12. B[i, j]¬"¬"