版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Eric_LH/article/details/83346292
例 最长公共字串 Longest common subsequence problem
问题描述:这个,很。。。显而易见吧,不知道的,。。。看这里 http://en.wikipedia.org/wiki/Longest_common_subsequence_problem
当然这里,我们也是要先找递归的。假设我的两个sequence,一个是X,长度为n;另一个是Y,长度为m。
现在假设我有两个point,一个是i,指在X的最后一个元素上,另一个是j,指在Y的最后一个元素上。我们的递归应该是分三种情况的。
1)如果X[i] == Y[j] 那么LCS(X[i],Y[j]) = LCS(X[i-1],Y[j-1]) + 1
这个很明显,因为发现了一组公共元素,就看剩下的有多少公共元素。
- 如果X[i] != Y[j] 那么 LCS(X[i],Y[j]) = max( LCS(X[i-1], Y[j]), LCS(X[i], Y[j-1]) )
这个其实也很容易相同,就是如果发现不同的,就去掉X或Y的最后一个,然后和另一个完整的比较,这样去掉X还是Y的最后一个,就有两种可能,所以就是要找中间max的一个。
- 如果 i=0 或者 j=0,就return 0
因为有一个sequence已经完了。
所以递归这里还是比较明显的:
LCS(n,m){
if m==0 || n==0
return 0;
if(X[n] == Y[m])
return LCS(n-1,m-1)+1;
else
return max( LCS(n,m-1), LCS(n-1,m) );
}
现在有了递归,我们就应该能把它写成tabular的DP。
初始化:Table LCS的第一行第一列都设为0。
for i = 1 to m
for j = 1 to n
if(X[i]==Y[j])
LCS[i,j] = LCS[i-1,j-1]+1;
else
LCS[i,j] = max(LCS[i,j-1], LCS[i-1,j] );