POJ 2533 Longest Ordered Subsequence
2014-04-06 11:23
513 查看
题目描述:LIS(Longest Increasing Subsequence)模板题
分析:O(n^2)的方法
状态表示:d[i]表示以i结尾的最长上升子序列长度
转移方程:d[i]=max{ 1,d(j)+1 } ( j=1,2,3,...,i-1且A[j]<A[i] )
即A[j]<A[i],d[i]=d[j]+1
A[j]>=A[i],d[i]=1
O(nlogn)的方法:
分析:O(n^2)的方法
状态表示:d[i]表示以i结尾的最长上升子序列长度
转移方程:d[i]=max{ 1,d(j)+1 } ( j=1,2,3,...,i-1且A[j]<A[i] )
即A[j]<A[i],d[i]=d[j]+1
A[j]>=A[i],d[i]=1
#include<cstdio> int main() { int N,a[10005],d[10005]; scanf("%d",&N); for(int i=0;i<N;i++) scanf("%d",&a[i]); int max=0; for(int i=0;i<N;i++) { d[i]=1; for(int j=0;j<i;j++) { if(a[j]<a[i]&&d[j]+1>d[i]) d[i]=d[j]+1; } if(d[i]>max) max=d[i]; } printf("%d\n",max); return 0; }
O(nlogn)的方法:
#include<cstdio> #include<algorithm> using namespace std; const int INF=1000000000; int N,a[10005],d[10005],g[10005]; int main() { scanf("%d",&N); for(int i=0;i<N;i++) scanf("%d",&a[i]); for(int i=1;i<=N;i++) g[i]=INF; int ans=0; for(int i=0;i<N;i++) { int k=lower_bound(g+1,g+1+N,a[i])-g; d[i]=k; g[k]=a[i]; ans=max(ans,d[i]); } printf("%d\n",ans); return 0; }
相关文章推荐
- Longest Repeated Sequence
- Timer 源码解读 (2) TaskQueue 最小堆实现的优先队列
- iOS学习中获取手机信息(UIDevice、NSBundle、NSLocale)
- 理解 Android Build 系统
- 代码手写UI,xib和StoryBoard间的博弈,以及Interface Builder的一些小技巧
- poj 2034 Anti-prime Sequences
- ios-UIImageView的一些常用的方法
- ios-UIAlertView,UIActionSheet-常用方法
- 动态规划小结 - 二维动态规划 - 时间复杂度 O(n*n)的棋盘型,题 [LeetCode] Minimum Path Sum,Unique Paths II,Edit Distance
- runOnUiThread代码块
- POJ1683_Common Subsequence_DP
- Java设计模式之从[Dota的武器创建]分析生成器(Builder)模式
- leetcode 难题 Unique Binary Search Trees
- POJ2785_Values whose Sum is 0_二分
- 06-流程控制及switch和continue的比较
- 使用AsyncTask异步更新UI界面及原理分析
- ios-UIActivityIndicatorView-常用方法
- ios-UIPageControl-常用方法
- ios-UISegmentedControl-常用方法
- Android (4-3)手機透過藍牙接收 Arduino 類比腳位狀態