二分求最长上升子序列 二分LIS

#include <iostream>
#include <cstring>
#define N 50010
using namespace std;
int n;
int num[N],dp[N],c[N];
int LIS(int *d){
    memset(c,0,sizeof(c));
    c[1]=d[1];
    int l,r,mid,len=1;
    for(int i=2;i<=n;i++){
        l=1;
        r=len;
        while(l<=r){
        mid=(l+r)/2;
        if(c[mid]<=d[i]) l=mid+1;
        else  r=mid-1;
        }
        c[l]=d[i];
        if(l>len) len++;

    }
    return len;
}
int main(){

    while(cin>>n){
        for(int i=0;i<n;i++){
            cin>>num[i];
        }

        cout<<LIS(num)<<endl;
    }
    return 0;
}

  

posted @ 2017-09-11 22:33  会飞的雅蠛蝶  阅读(218)  评论(0编辑  收藏  举报