codevs1576

#include <stdio.h>

int OK(int c[],int num[],int i,int k){

int f=1,l=k;
while(f<=l){
int m=(f+l)/2;
if(num[c[m]]<num[i]) f=m+1;
else l=m-1;
}
return f;
}

int LIS(int num[],int n){

int c[5001],k=1;
c[0]=-1,c[1]=0;
for(int i=0;i<n;i++){
int dex=OK(c,num,i,k);
c[dex]=i;
if(dex>k) k=dex;
}
return k;
}

int main(){

int n,num[5001];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&num[i]);
int ans=LIS(num,n);
printf("%d ",ans);
return 0;
}

原文地址:https://www.cnblogs.com/huaixiaohai2015/p/5261930.html