51nod 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
具体解法看我的另一篇详细解释:
不过此题只能用nlog(n)的复杂度的解法!
#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std;
#define Maxn 50010
typedef 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;
}