题目大意
给定两个序列 a 和 b, 求 b 中元素按照 a 的子序列中元素出现的次序 的 最大公共序列长度.
题目分析
当 a 为 0 或者 b 为 0, 则平凡态为 0
f(0, l) = f(m, 0) = 0
当 两个序列当前的末尾相同, 即 a[i] == a[j], 则当前长度等于原有长度 + 1.
f(i, j) = f(i, j - 1) + 1
// m 相同代表末尾颜色相同, l - 1 表示先前(即长度减一)的状态.当两个序列当前的末尾不相同, 即 a[i] != a[j], 肯定不可以进行拼凑.
所以当前状态f(i, j)的值肯定由上一个 a[i] == a[j]的状态转移而来.
我们可以缩短a的长度来改变a的末尾元素, 即 f(i - 1, j).
或者缩短b的长度来改变b的末尾元素, 即f(i, j - 1).
代码
|
|