动态规划问题(二)——最长公共子序列

一、问题描述
最长公共子序列(longest common subsequence, LCS)问题:给定两个序列X=(x1, x2, … , xm)和
Y=(y1, y2, … , yn), 求X和Y长度最长的公共子序列。
二、暴力求解方法
蛮力法是解决最长公共子序列问题最容易想到的方法,即对X的每一个子序列,检查是否为Y的子序列,从而确定它 是否为X和Y的公共子序列,并且选出最长的公共子序列。
X和Y的所有子序列都检查过后即可求出X和Y的最长公共子序列。X的一个子序列相应于下标序列1,2,…,m的一个子 序列。因此,X共有2^m个子序列。当然,Y也有2^n个子序列。
因此,蛮力法的时间复杂度为O(2^n * 2^m),这可是指数级别,绝对不可取!

三、动态规划方法
1.刻画最长公共子序列的特征
①首先定义前缀的概念:给定一个序列X=(x1, x2, … , xm),对i=0, 1, … , m, 定义X的第i前缀为
X=(x1, x2, … , xi)。其中X0是空串。
②LCS的最优子结构:
令X=(x1, x2, … , xm)和Y=(y1, y2, … , yn)为两个序列,Z=(z1, z2, … , zk)为X和Y的任意LCS。
a.如果xm=yn,则zk=xm=yn且Zk-1是Xm-1和Yn-1的一个LCS;
b.如果xm≠yn,那么zk≠xm意味着Z是Xm-1和Y的一个LCS;
c.如果xm≠yn,那么zk≠yn意味着Z是X和Yn-1的一个LCS。

2.一个递归解
定义c[i, j]表示Xi和Yj的LCS长度。如果i=0或j=0,即一个序列长度为0,那么LCS的长度为0。根据LCS问题的最优 子结构性质,有:
①若i=0或j=0, c[i, j]=0;
②若i, j>0且xi=yj,c[i, j]=c[i-1, j-1]+1;
③若i, j>0且xi≠yj,c[i, j]=max(c[i, j-1], c[i-1, j]).

3.C语言实现
(1)计算LCS的长度(最长长度即为c[m][n])


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值