数据结构与算法学习之路:LIS——最长递增序列的动态规划算法和二分思想算法
来源:互联网 发布:淘宝全民切红包 编辑:程序博客网 时间:2024/06/06 03:03
一、最长递增序列的问题描述:
求一个整数序列的最长递增子序列,子序列不要求是连续的。例如:
Input:4,6,9,6,7,6,3,8,10;Output:5
二、解决方法:
1、用动态规划的方法解决。从问题我们可以知道,我们最终得到的最长递增子序列,其任意一段子序列也是对应序列中的最长子序列。这样说可能不好理解,就以上面的例子来说:
最长子序列为:4,6, 7, 8, 10。在这段子序列的子序列里选一个,例如:4,6,7。则4,6,7也是4,6,9,6,7,6,3这段序列的最长子序列。
对于动态规划思想,我们最重要的是找到状态和状态转移方程,那我们来看看这里怎么得到这两个关键东西:
假设,nums={4,6,9,6,7,6,3,8,10},f(x)表示前x个数以nums[x]结尾的序列中,最长子序列的长度,那么:
f(1)=1;f(2)=max{f(1)+1,1}=2;f(3)=max{f(2)+1,1},……以此类推。这里或许有人问了,为什么是f(x-1)+1和1比较啊?原因很简单:以f(2)为例,f(2)=f(1+1),而f(1)=1,也就是说,f(2)的结果是和f(1)关联的,而f(2)本身具有一个初始值1,根据问题要求f(2)的最终值应该是通过f(1)运算所得值和它的初始值选大的那一个。后面的也就以此类推了。
2、这种方法非常巧妙,主要思想是这样的,我不管你的序列是由什么组成的,我只在乎这个序列的长度是多少。于是我创建一个数组d[length],d[0]用来存储最长序列长度,d[i]表示最长递增序列长度为i时,序列的结尾元素。通过二分查找不断的为元素找插入的位置,构成一个最长序列。
这种解法的关键在于:我们要获得的最长递增序列,事实上只要保证每个位置的数字足够小,而且有序,那么得到的自然是最长子序列。说的可能不太清楚,大家可以通过代码感受一下我的意思。
三、代码:
1、O(n^2)的DP算法
int lis1(int* nums, int length){int lis_len = 1;int d[9];for (int i = 0; i < length; ++i){d[i] = 1;for (int j = 0; j < i; ++j)if (nums[i] >= nums[j] && d[i] < d[j] + 1)++d[i];if (lis_len < d[i])lis_len = d[i];}return lis_len;}
2、O(nlogn)的二分思想算法
int lis2(int* nums, int length){int d[9];int mid, left, right;d[0] = 1;d[1] = nums[0];for (int i = 1; i < length; ++i){left = 1;right = d[0];while (left <= right){mid = (left + right) / 2;if (nums[i] > d[mid])left = mid + 1;elseright = mid - 1;}d[left] = nums[i];if (left > d[0])++d[0];}return d[0];}
- 数据结构与算法学习之路:LIS——最长递增序列的动态规划算法和二分思想算法
- 算法系列笔记6(动态规划—最长公共子序列/串lcs和最长递增子序列(LIS))
- 尝试解释LIS(最长递增子序列)的一种动态规划算法
- 【动态规划】LIS最长单调递增子序列 logn算法 并且输出子序列
- 动态规划算法之最长递增子序列问题
- 最长单调子序列LIS的简单动态规划算法
- 算法分析与设计-11-最长递增子序列的动态规划算法
- 算法——最长递增子序列(LIS)
- 数据结构与算法学习之路:背包问题的贪心算法和动态规划算法
- 最长递增子序列LIS算法
- 最长递增子序列LIS递归算法
- 【面试题之算法部分】LIS最长递增子序列
- 动态规划 —— 最长递增子序列(LIS)
- 最长递增子序列LIS(动态规划+二分查找)
- 算法_动态规划_最长单调递增子序列
- 算法-动态规划解决最长递增子序列
- 算法学习之动态规划--最长上升子序列
- 算法学习之动态规划--最长公共子序列
- 项目框架中关于缓存机制的配置
- java给手机发送短信(转)
- Codeforces Round #279 (Div. 2) D. Chocolate
- 通过JLINK实现串口显示调试
- Eclipse Java注释模板设置详解
- 数据结构与算法学习之路:LIS——最长递增序列的动态规划算法和二分思想算法
- 第14周 项目1-折腾二维数组(5)
- OC内存管理
- 第14周项目1 数组大折腾
- 学习有关Paint绘制效果总结(一)
- 各大网站架构总结笔记
- EL表达式判断Map是否为空和map的取值
- Eclipse CodeStyle clean up 设置
- 缓存、缓存算法和缓存框架简介