LCS算是动态规划中比较经典的一道题目,很多书上都讲了这个,题目的描述大概就是有两个序列,从两个序列中找到一个序列(这个序列的长度<=两个序列长度的最小值)使得这个序列是开始的两个序列的子序列。这个题如果用穷举法将所有的序列找到,求出最长公共子序列,这种解法的复杂度是O(2^m)。
因为是动态规划的经典题目,所有特点很明显。
最优子结构(子问题的最优解是原问题的最优解),例如两个字符序列s1和s2,现在要求s1和s2的最长公共子序列a,s1[i-1]和s2[j-1]算是s1和s2的两个子序列,求出s1[i-1]和s2[j-1]的最长子序列,就相当与求出了s1和s2中不包含元素s1[i],s2[j]最长公共子序列。
递推式:
如果s1的第i个元素和s2的第j个元素相等,说明最长的子序列包含s1[i],s2[j],所有c[i][j]=c[i-1][j-1]+1;(c[i][j]表示s1的长度为i,s2的长度为j的两个序列的最长公共子序列的长度)
如果s1的第i个元素和s2的第j个元素不相等,去掉最后一个元素得到的序列s1[i-1]和s2序列求最长,和s1和s2[j-1]求最长。
粘贴一个别人的:
①最优子结构
设 X=(x1,x2,.....xn) 和 Y={y1,y2,.....ym} 是两个序列,将 X 和 Y 的最长公共子序列记为LCS(X,Y)
找出LCS(X,Y)就是一个最优化问题。因为&#x