动态规划法——最长公共子序列问题
这个题当初始终看不下去的原因就是当初误解了什么叫最长公共子序列,还一度以为这个题有问题,事实上假设明确了什么叫最长公共子序列,也就攻克了一半的问题。
什么是最长公共子序列?
什么是最长公共子序列呢?举个简单的样例吧。一个数列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了。
小结:
本题中的标记箭头比較有意思,能很清楚的看出问题规模的变化趋势。