动态规划--最长递增子序列

Posted A.ArmStrong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划--最长递增子序列相关的知识,希望对你有一定的参考价值。

  经典的最长子序列问题,最近编程训练遇到此题苦无思路,在网上找到比较规范的解答,细思两天后还是觉得有点问题,现在整理总结如下:

参照 https://www.cnblogs.com/hapjin/p/5597658.html

1. 问题描述:

给定一个序列,求解它的最长 递增 子序列 的长度。比如: arr[] = {3,1,4,1,5,9,2,6,5}   的最长递增子序列长度为4。即为:1,4,5,9

2.DP算法分析:

按照上述作者的解答  

①最优子问题

设lis[i] 表示索引为 [0...i] 上的数组上的 最长递增子序列。初始时,lis[i]=1,注意,在DP中,初始值是很重要的,它是整个算法运行正确的关键。而初始值 则可以 通过 画一个小的示例来 确定。

当 arr[i] > arr[j],lis[i] = max{lis[j]}+1 ;其中,j 的取值范围为:0,1...i-1

当 arr[i] < arr[j],lis[i] = max{lis[j]} ;其中,j 的取值范围为:0,1...i-1 

================================================================

这里的关键是 理解lis[i] = max{lis[j]} +1,max{lis[j]} 表示到第j个元素且以此元素结尾的最长子序列,所以当arr[i]大于末尾元素时,最长子序列应该加第i个元素;

以上是关于动态规划--最长递增子序列的主要内容,如果未能解决你的问题,请参考以下文章

用数学语言说一下动态规划求数列最长递增子序列的解

动态规划+二分查找解决最长递增子序列

JAVA动态规划,最长递增子序列的代码太难理解,求大神帮我讲解一下!

动态规划--最长递增子序列

单调递增最长子序列(动态规划)

算法之动态规划(最长递增子序列——LIS)