51nod 1134 最长递增子序列 dp(经典)
来源:互联网 发布:百度百科如何优化 编辑:程序博客网 时间:2024/05/21 14:46
1134 最长递增子序列
基准时间限制:1 秒空间限制:131072 KB 分值: 0 难度:基础题
收藏
关注
给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的)
例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。
Input
第1行:1个数N,N为序列的长度(2 <= N <= 50000)
第2 - N + 1行:每行1个数,对应序列的元素(-10^9 <= S[i] <= 10^9)
Output
输出最长递增子序列的长度。
Input示例
8
5
1
6
8
2
4
5
10
Output示例
5
//超时代码 #include<cstdio>#include<cstring>#include<iostream>using namespace std;int main(){int a[50001],n,dp[50001],maxx=-999999999;scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);dp[i]=1;for(int j=1;j<i;j++)if(a[j]<a[i])dp[i]=max(dp[i],dp[j]+1);maxx=max(maxx,dp[i]);}cout<<maxx<<endl;return 0;}
//优化后的代码 #include<cstdio>#include<iostream>using namespace std;int n,dp[50001]={0,1e+9},len=1,t,k;int find(int num){int low=1,mid,high=len;while(low<=high){mid=(high+low)/2;if(dp[mid]==num) return mid;if(dp[mid]>num) high=mid-1;else low=mid+1;}return low;}int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&t);k=find(t);if(k<=len) dp[k]=t;else dp[++len]=t;}printf("%d\n",len);return 0;}
1 0
- 51nod 1134 最长递增子序列 dp(经典)
- 51NOd 1134 最长递增子序列(dp)
- 51nod 1134 最长递增子序列(dp)
- 51nod 1134 最长递增子序列 DP
- 51nod 1134 最长递增子序列
- 51nod 1134 最长递增子序列
- 51nod 1134 最长递增子序列
- [51nod]1134 最长递增子序列
- 51nod 1134 最长递增子序列
- 51Nod 1134 最长递增子序列
- 51nod 1134最长递增子序列
- 51nod 1134 最长递增子序列
- 51Nod 1134 最长递增子序列
- 【51nod】1134 最长递增子序列
- 51Nod-1134 最长递增子序列
- 51nod 1134 最长递增子序列
- 51 nod 1134 最长递增子序列
- 51Nod-1134-最长递增子序列
- javaScript学习之路
- 网络数据注入工具HexInject
- Codeforces 363D Renting Bikes
- C语言指针详解----指针声明定义赋值
- 工作流学习——Activiti流程实例、任务管理四步曲
- 51nod 1134 最长递增子序列 dp(经典)
- openstack 逻辑构架真相
- A Serial Killer
- table元素的宽度/高度设置问题
- Makefile 中 -wl ,rpath 以及 O0 O1 O2 O3 Os 的用法
- 《精进:如何成为一个很厉害的人》
- 编码 分而治之
- 可重入函数与线程安全
- 第七讲项目三 算工资