最长上升子序列问题(LIS)
2016-07-06 16:44
323 查看
本文给出两种求解最长上升子序列(LIS)的思路。
d[i]=max{d[j]+1},其中1<=j<i且a[j]<a[i]。
算法时间复杂度为O(n^2)。
设c[k]表示最长递增子序列长度为k时最小a[i]值。
算法主要实现过程:
1. 设当前已经求出的最长上升子序列的长度为len(初始为1),每次读取下一个新元素x;
2. 若x>c[len],则直接加入到c的末尾,且len++。否则,在c中二分查找,找到最后一个
比x小的数c[k],使c[k+1]=x。
算法时间复杂度为O(nlgn)。
思路1:
设d[i]表示以a[i]为结尾的最长递增子序列的长度,d[i]=max{d[j]+1},其中1<=j<i且a[j]<a[i]。
算法时间复杂度为O(n^2)。
思路2:
考虑输入数组中的两个数a[i]和a[j],i<j,a[i]<a[j]且d[i]=d[j],选择构造最优解时,应该选择a[i]。设c[k]表示最长递增子序列长度为k时最小a[i]值。
算法主要实现过程:
1. 设当前已经求出的最长上升子序列的长度为len(初始为1),每次读取下一个新元素x;
2. 若x>c[len],则直接加入到c的末尾,且len++。否则,在c中二分查找,找到最后一个
比x小的数c[k],使c[k+1]=x。
算法时间复杂度为O(nlgn)。
相关文章推荐
- [51nod1201]整数划分
- 【51Nod 1040】最大公约数之和
- 管道和FIFO
- SharedPreferences StringSet 保存失败
- spinner 下拉框实例
- (4) tcpdump -i vboxnet0 > vboxnet0.txt
- 快速集成Android的水波纹效果解决低版本报错问题
- sql server触发器操作实例
- Python和opencv打开摄像头
- java 二叉树(四)求二叉树的深度和节点总数
- Android界面编程——Android布局组件(二)
- JAVA中IO总结
- iptables
- IM开发(1)-ejabberd服务器搭建
- Python调用微博API获取微博内容
- HDU3410 Passing the Message (单调队列,线段树可解)
- expdp 详解及实例
- iOS oc页面的跳转
- phoenix-4.7.0常用命令
- 最完美的android 隐藏键盘方案