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个数NN为序列的长度(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
原创粉丝点击