最长递增子序列 (dp)

来源:互联网 发布:linux查系统配置 编辑:程序博客网 时间:2024/05/20 16:33
给出长度为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 <= Sii <= 10^9)
Output
输出最长递增子序列的长度。
Sample Input
8
5
1
6
8
2
4
5
10
Sample Output

5



nlogn的做法(二分)

AC代码:

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>#include<string>#include<queue>#include<set>#include<vector>#include<map>#include<stack>#include<cstdlib>using namespace std;typedef long long ll;ll a[55000];ll dp[55000];int main(){int n;scanf("%d",&n);for(int i=0;i<n;i++)        scanf("%lld",&a[i]);    dp[0]=a[0];    int l=0,r,mid,len=1;    for(int i=1;i<n;i++){        l=0;        r=len;        while(l<r){            mid=(l+r)/2;            if(dp[mid]<a[i])l=mid+1;            else r=mid;        }        dp[l]=a[i];        if(l>=len)len++;    }    printf("%d\n",len);return 0;}


原创粉丝点击