上次在实验室作《从分治到动归 - 最优问题解法》的讲座的时候,举了LCS(最长公共子序列)作为例子。当时讲的是传统的动态规划解法。下面先提一下这个解法作为铺垫。LCS问题LCS是Longest Common Subsequence的缩写,即最长公共子序列。一个序列,如果是两个或多个已知序列的子序列,且是所有子序列中最长的,则为最长公共子序列。例如:X={A,B,C,B,D,A,B}Y={B,D,C,A,B,A}则X和Y的最长公共子序列(之一)是{B,C,B,A}传统动归解LCS设有二维数组f[i,j] 表示 X 的 i 位和 Y 的 j 位之前的最长公共子序列的长度,则有:f[i,j] = max{f[i-1][j -1] + same(i,j),f[i-1,j],f[i,j-1]}其中,same(a,b)当 X 的第 a 位与 Y 的第 b 位相同时为“1”,否则为“0”。初值:f[i][0]=0 f[0][i]=0 f[1][1] = same(1,1)这个动归方程乍看可能不好理解。它的思想是这样的。对于已知f[i][j]的值,要往后拓展,有这两种情况:其末位i和j相同,或不相同。考虑相同情况。因为i和j相同,它们必然已被记入最长公共子序列的部分。此时要想延长这个公共子序列,只得令i和j都向后移,看看它们后一位是否也相同。这就是f[i][j]+same(i+1,j+1)。而对于
...
继续阅读
(16)