动态规划详解(第二讲)——最长公共子序列问题(LCS)

本文详细介绍了最长公共子序列(LCS)问题,通过暴力求解和动态规划两种方法进行讲解。动态规划方案中,给出了LCS的递推式,并解释了状态转移的过程。最后,提供了C++代码示例,适用于解决相关问题。
摘要由CSDN通过智能技术生成

最长公共子序列问题(LCS)

公共子序列的意思是在两个序列中,按顺序找出共同出现的元素,这些元素按顺序排列就是原序列的子序列:例如A=zxyxyzB=xyyzx;则A和B的一个公共子序列为:xyy,而最长公共子序列是:xyyz。因此,A和B的LCS长度为4.


POJ和HDU上面有LCS的题目,下边给出入门级别的题目:

(1)先说一下暴力方案( • ̀ω ⁃᷄)✧

  • 设序列A长度为n,序列B长度为m。
  • 列举出A所有的 2n 2 n 个子序列,对于每一个子序列在 Θ(m) Θ ( m ) 时间内来确定它是否也是B的子序列。
  • 很明显,此算法的时间复杂度 Θ(m2n) Θ ( m 2 n )

    这个方案想法简单,但很可能TLE(time limited exceed),所以就有了下面的算法———

(2)动态规划 Σ>―(〃°ω°〃)♡→

为了方便理解问题,我们约定序列的起始地址为1,而不是0。

首先我们寻找求LCS长度的状态转移方程(也就是递推式)。
A=a1a2...an A = a 1 a 2 . . . a n , B=b1b2...bm B = b 1 b 2 . . . b m .
L[i][j] L [ i ] [ j ] 表示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值