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

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

参照 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个元素;

posted @ 2017-11-16 13:09  A.ArmStrong  阅读(286)  评论(0编辑  收藏  举报