标签:
子序列
公共子序列
最长公共子序列
输入:
输出:X与Y的最长公共子序列
最长公共子序列结构分析
第i前缀
设
例:
优化子结构的猜想
if
if
if
优化子结构的证明
思路:对于LCS问题,把最优解分解成两部分,且保证子问题无关性,对两部分分别用反正法,即假定两个子问题的最优解不是最优的,通过“剪切粘贴”构造另一个子最优解,把构建后的子最优解粘贴到原问题中,得出矛盾。
情况一:
证明 设
若
存在
于是
与
情况二和情况三证明略。
子问题重叠性
建立LCS长度的递归方程
自底向上计算优化解代价
C[0,0] C[0,1] C[0,2] C[0,3] C[0,4]
C[1,0] C[1,1] C[1,2] C[1,3] C[1,4]
C[2,0] C[2,1] C[2,2] C[2,3] C[2,4]
C[3,0] C[3,1] C[3,2] C[3,3] C[3,4]
如果想要计算C[3,4],需要先计算
C[2,3] C[2,4]
C[3,3]
如果要计算C[2,3],需要计算
C[1,2] C[1,3]
C[2,2]
如果要计算C[3,3] ,需要计算
C[2,2] C[2,3]
C[3,2]
……..所以最先要计算的是
C[0,0] C[0,1] C[0,2] C[0,3] C[0,4]
C[1,0]
C[2,0]
C[3,0]
之后根据递归公式逐行计算
C[0,0] C[0,1] C[0,2] C[0,3] C[0,4]
C[1,0]
C[2,0]
C[3,0]
计算LCS长度的算法
数据结构:
构造最优解
从B[m,n]开始按指针搜索
若B[i,j]=
如此找到的LCS是X与Y的LCS的Inverse
标签:
原文地址:http://blog.csdn.net/niujiabinbin/article/details/51538820