LIS(nlgn) DP
来源:互联网 发布:网络大电影导演片酬 编辑:程序博客网 时间:2024/06/05 17:20
这题为挑战程序设计竞赛的例题。
O(n^2)的解法有两种:
第一种:dp[i]表示以第i个数结尾的LIS的长度。每次都得把1<=k<=i-1扫描一遍,因为每个a[i]的值不同,前面的值也没有单调性,所以只能每次O(n).
第二种:dp[i]表示LIS长度为i时结尾数字的最小值。枚举a[i]时找到第一个比a[i]大的a[k],更新dp[k]=a[i]。其实可以证明dp[]数组是单调递增的,因为假设不递增,必然存在一个dp[j]>=dp[j+1],那么一定可以推出矛盾,自己画画就可以了。那么每次只会更新一个值。可以用二分查找,于是做到O(nlgn)。
代码
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define INF 0x7fffffffusing namespace std;const int maxn = 1005;int dp[maxn],a[maxn];//dp[i] 表示LIS长度为i时最后一个数字的最小值.int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); dp[i]=INF; } for(int i=1;i<=n;i++){ *lower_bound(dp+1,dp+1+n,a[i])=a[i]; //lower_bound 的用法 返回了第一个大于等于a[i]的指针 并更新它 } printf("%d\n",lower_bound(dp+1,dp+1+n,INF)-dp-1); return 0;}
0 0
- LIS(nlgn) DP
- UVa1471 LIS变种 nlgn
- uva10635(lcs lis O(NlgN))
- uva 10534 - Wavio Sequence(nlgn复杂度LIS)
- LIS O(nlgn)最简写法
- LIS DP
- 最长上升子序列LIS O(nlgn)算法
- zoj2136 最长上升子序列LIS O(NlgN)解法
- LIS (最长上升字序列) nlgn 解法
- HDU 4001 DP LIS
- poj2533 简单DP LIS
- UVA 10534 DP+LIS
- poj 2533 DP(LIS)
- 【dp:LIS】hdu1025
- poj 1836 dp lis
- POJ 3670 DP LIS?
- 【DP】【LIS】道路修建
- poj-3616 DP,LIS
- HashMap实现原理分析
- java 访问 http 返回 json 数据
- 数据库第三次作业参考答案
- ssh登陆提示信息
- Java获取两个日期相差的月数
- LIS(nlgn) DP
- Activitys,Threads,&Memory Leaks
- hnustoj 并查集——宗教信仰
- CBService-CBMutableService学习笔记
- 《实体解析与信息质量》-2.1.1信息质量
- Python网络编程基础笔记-poll实现非阻塞socket
- vim 设置编码格式
- python select模块.select实现非阻塞socket,Popen等(特别在 Unix 下,它还可以用于管道)
- powerDesigner设置 name不自动等于code