最长公共子序列问题(LCS)
公共子序列的意思是在两个序列中,按顺序找出共同出现的元素,这些元素按顺序排列就是原序列的子序列:例如A=zxyxyz,B=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 ] 表示