这个题当初始终看不下去的原因就是当初误解了什么叫最长公共子序列,还一度以为这个题有问题,其实如果明白了什么叫最长公共子序列,也就解决了一半的问题。
什么是最长公共子序列?
什么是最长公共子序列呢?举个简单的例子吧,一个数列S,若分别是两个或多个已知序列的子序列,且是所有符合条件序列中最长的,则S称为已知序列的最长公共子序列。
注意区别:
最长公共子串和最长公共子序列
最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common Subsequence,LCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列;也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续。
图解一下最长公共子序列:
首先,我们先得找出一个构造最优解的过程:
然后 简单说一下动态规划的整个过程(通用算法):
本本题中,我要求解l[7,6],那么我先找到表中第7行第6列的标记,发现是个向上的箭头,说明了l[7,6]=l[6,6], 此时我又找到l[6.,6],发现标记的是个左上角的箭头,说明此时的A包含在解数组里面,将它加入到解数组中,之后将问题规模缩小到了l[5,5],再看l[5,5]…..
在我查找的过程中,随着l[I,j]中i和j的变化,这个问题的规模在逐渐缩小,直至我们遇到l[I,j]=0时停止搜索。
再说我们构造上表的过程,构造的时候,我们是从底到顶构造的,但是在求解的时候,我们是自顶向下求解的。
具体伪代码就不再解释,这个比较简单,只要思路就ok了。
小结:
本题中的标记箭头比较有意思,能非常清楚的看出问题规模的变化趋势。
原文地址:http://blog.csdn.net/lhc1105/article/details/40516017