

题意:
给定两个字符串,求两串的最长公共子序列(LCS问题)
思路:
直接上dp分析:
f[i,j] 状态表示:
集合:所有 a[1 ~ i] 与 b[1 ~ j] 的 公共子序列 的集合
属性:长度的最大值 max
状态计算:
集合划分:
依据最后一个不同点,我们可以分为 4 类:
- ①
a[i]、b[j]均存在于最长公共子序列(11) - ②
a[i]、b[j]均不存在于最长公共子序列(00) - ③
a[i]不存在,而b[j]存在(01) - ④
a[i]存在,而b[j]不存在(10)
对各类分别求得 max,汇总起来再取 max,即为 f[i,j] 的答案。
第 ① 类很好求,其存在的条件当然是 a[i]==b[j],根据定义,此类的最大值为:f[i-1,j-1] + 1。
第 ② 类根据定义也很显然,为:f[i-1,j-1]。
第 ③ 类就需要好好分析了:
先尝试用式子 f[i-1,j] 对该类进行计算,但 f[i-1,j] 并不完全等价于这一类,
因为此类所指的是:“a[i] 不包含,而 b[j] 包含”,
而

本文详细解析了如何使用动态规划解决最长公共子序列问题,包括状态定义、状态转移方程推导及代码实现。
最低0.47元/天 解锁文章
875

被折叠的 条评论
为什么被折叠?



