51nod 1134最长递增子序列

来源:互联网 发布:建筑工程图纸软件 编辑:程序博客网 时间:2024/05/22 12:09

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示例
8516824510
Output示例
5




具体解法看我的另一篇详细解释:


最长上升子序列的两种解法


不过此题只能用nlog(n)的复杂度的解法!


#include <iostream>#include<cstdio>#include<string.h>using namespace std;#define Maxn 50010typedef long long ll;ll arr[Maxn],ans[Maxn],len;int main(){    ll p,i,j,k;    //scanf("%d",&T);    //while(T--)    //{        scanf("%lld",&p);        for(i=1;i<=p;i++)        {            scanf("%lld",&arr[i]);        }        ans[1]=arr[1];        len=1;        for(i=2;i<=p;i++)        {            if(arr[i]>ans[len])                ans[++len]=arr[i];            else{                ll pos =lower_bound(ans+1,ans+len,arr[i])-ans;                ans[pos]=arr[i];            }        }        printf("%lld\n",len);   // }    return 0;}













原创粉丝点击