LCS 问题动态规划实现方案

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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值