码迷,mamicode.com
首页 > 其他好文 > 详细

DP入门(4)——线性结构上的动态规划

时间:2017-09-09 11:56:12      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:abc   bcb   一个   lcs   span   nlogn   理解   删除   组成   

一、最长上升子序列(LIS)

  给定n个整数A1,A2,…,An,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除0个或多个数,其他数的顺序不变)。例如序列1,6,2,3,7,5,可以选出上升子序列1,2,3,5,也可以选出1,6,7,但前者更长。选出的上升子序列中相邻元素不能相等。

  分析:设d(i)为以i结尾的最长上升子序列的长度,则d(i)= max{0,d(j)|j<i,Aj<Ai}+1,最终答案是max{d(i)}。如果LIS中的相邻元素可以相等,把<改成<=即可。上述算法的时间复杂度为O(n2)。《算法竞赛入门经典》中介绍了一种方法把它优化到O(nlogn),可以去阅读。

二、最长公共子序列问题(LCS)

  给两个子序列A和B,A为abcbdab,B为bdcaba。求长度最长的公共子序列。例如1,5,2,6,8,7和2,3,5,6,9,8,4的最长公共子序列为5,6,8(另一个解是2,6,8)。

  分析:设d(i , j)为A1,A2,…,Ai和B1,B2,…,Bj的LCS长度,则当A[i]=A[j]时d(i , j)= d(i-1, j-1)+1,否则d(i , j)= max{d(i-1, j),d(i , j-1)},时间复杂度为O(nm),其中n和m分别是序列A和B的长度。

 

DP入门(4)——线性结构上的动态规划

标签:abc   bcb   一个   lcs   span   nlogn   理解   删除   组成   

原文地址:http://www.cnblogs.com/xzxl/p/7497447.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!