LCS问题具有最优子结构
令 X=<x1,x2,...,xm>X=<x1,x2,...,xm> 和 Y=<y1,y2,...,yn>Y=<y1,y2,...,yn> 为两个序列,Z=<z1,z2,z3,...,zk>Z=<z1,z2,z3,...,zk>为XX和YY的任意LCS。则
如果xm=ynxm=yn,则zk=xm=ynzk=xm=yn且Zk−1Zk−1是Xm−1Xm−1和Yn−1Yn−1的一个LCS。
如果xm≠ynxm≠yn,那么zk≠xmzk≠xm,意味着ZZ是Xm−1Xm−1和YY的一个LCS。
如果xm≠ynxm≠yn,那么zk≠ynzk≠yn,意味着ZZ是XX和Yn−1Yn−1的一个LCS。
从上述的结论可以看出,两个序列的LCS问题包含两个序列的前缀的LCS,因此,LCS问题具有最优子结构性质。在设计递归算法时,不难看出递归算法具有子问题重叠的性质。
设C[i,j]C[i,j]表示XiXi和YjYj的最长公共子序列LCS的长度。如果i=0i=0或j=0j=0,即一个序列长度为00时,那么LCS的长度为0。根据LCS问题的最优子结构性质,可得如下公式:
C[i,j]=⎧⎩⎨0,C[i−1,j−1]+1,MAX(C[i,j−1],C[i−1,j])当i=0或j=0当i,j>0且xi=yj当i,j>0且xi≠yj
Java:
package com.dorr.alo.impl;