这个的思路就是再开一个数组,存储长度为i的最长上升子序列的最后一个数字是多少,这个数组可以保证递增,之后开始二分,只要当前这个数是大于i-1的数但小于i的数,那就可以更新i的数,这里就是贪心的思想,相同长度结尾数字越小越好
int len=0;
for(int i=1;i<=n;i++){
int l=1,r=len+1;
int ans=-1;
while(l<=r){
int mid=(l+r)/2;
// cout<<a[i]<<" "<<q[mid]<<endl;
if(q[mid]<a[i]){
l=mid+1;
}
else{
ans=mid;
r=mid-1;
}
}
if(ans!=-1) {
q[ans] = a[i];
len=max(len,ans);
}
else{
q[len+1]=a[i];
len++;
}
}
cout<<len<<endl;
标签:二分,int,序列,最长,单调,贪心
From: https://www.cnblogs.com/zyzzzz/p/17588755.html