动态规划法——最长公共子序列问题

简介:        这个题当初始终看不下去的原因就是当初误解了什么叫最长公共子序列,还一度以为这个题有问题,其实如果明白了什么叫最长公共子序列,也就解决了一半的问题。   什么是最长公共子序列?      什么是最长公共子序列呢?举个简单的例子吧,一个数列S,若分别是两个或多个已知序列的子序列,且是所有符合条件序列中最长的,则S称为已知序列的最长公共子序列。




       这个题当初始终看不下去的原因就是当初误解了什么叫最长公共子序列,还一度以为这个题有问题,其实如果明白了什么叫最长公共子序列,也就解决了一半的问题。


 

什么是最长公共子序列?

     什么是最长公共子序列呢?举个简单的例子吧,一个数列S,若分别是两个或多个已知序列的子序列,且是所有符合条件序列中最长的,则S称为已知序列的最长公共子序列。

 

   注意区别:


                 最长公共子串和最长公共子序列

  

      最长公共子串(Longest Common Substirng)和最长公共子序列(Longest Common SubsequenceLCS)的区别为:子串是串的一个连续的部分,子序列则是从不改变序列的顺序,而从序列中去掉任意的元素而获得新的序列;也就是说,子串中字符的位置必须是连续的,子序列则可以不必连续。



 图解一下最长公共子序列:



 

   



    首先,我们先得找出一个构造最优解的过程:


    



   

  然后 简单说一下动态规划的整个过程(通用算法):



      



           本本题中,我要求解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了。

 

 


小结:


      本题中的标记箭头比较有意思,能非常清楚的看出问题规模的变化趋势。

 







目录
相关文章
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
|
27天前
|
算法
动态规划算法学习二:最长公共子序列
这篇文章介绍了如何使用动态规划算法解决最长公共子序列(LCS)问题,包括问题描述、最优子结构性质、状态表示、状态递归方程、计算最优值的方法,以及具体的代码实现。
111 0
动态规划算法学习二:最长公共子序列
|
1月前
|
机器学习/深度学习 人工智能 算法
【算法】最长公共子序列(C/C++)
【算法】最长公共子序列(C/C++)
|
算法 JavaScript Go
【动态规划】最长递增子序列
【动态规划】最长递增子序列
|
算法
【学会动态规划】 最长递增子序列(26)
【学会动态规划】 最长递增子序列(26)
42 0
深入理解动态规划算法 - 最长公共子序列
深入理解动态规划算法 - 最长公共子序列
75 0
深入理解动态规划算法 | 最长公共子序列LCS
深入理解动态规划算法 | 最长公共子序列LCS
124 0
力扣1143. 最长公共子序列 动态规划之最长公共子序列
力扣1143. 最长公共子序列 动态规划之最长公共子序列
190 0
力扣1143. 最长公共子序列 动态规划之最长公共子序列
LeetCode 动态规划之最长公共子序列
LeetCode 动态规划之最长公共子序列
139 0
LeetCode 动态规划之最长公共子序列