动态规划之最长公共子序列问题(LCS)
1.问题
给定序列X=<x1, x2,…, xm>,Y=< y1, y2,…, yn>,求X和Y的最长公共子序列。
2.解析
设X=<x1,x2,…,xm>,Y=<y1,y2…,yn>为两个序列,Z=<z1,z2,…,zk>是他们的任意公共子序列。
经过分析可得:
1、xi = yj,那么zk = xi = yj ,Zk-1是Xi-1和Yj-1的最长公共子序列
2、xi != yj,zk != xi ,那么Zk是Xi-1和Yj的最长公共子序列
3、xi != yj,zk != yj ,那么Zk是Xi和Yj-1的最长公共子序列
因此,我们先把dp数组的第一行和第一列进行赋值为0,然后从dp[1][1]开始填表,填到dp[m][n],所得到的dp[m][n]就是LCS的长度。
实例:X=<A,B,C,B,A>,Y=<B,D,C,A,A>
第一行和第一列初始化为0
若Xi和Yj不相等,所填的值为上方或左方大的那个
若Xi和Yj相等,所填的值为左上方的值加1
按照此规律填表,最终可以得到如下表的数据
由表可得,X和Y序列的最长公共子序列长度为2
为了最终能获得X和Y序列的最长公共子序列,我们需要一个二维数组来进行标记,具体看设计的板块。
3.设计
4.分析
时间复杂度:T(n)=O(m*n)