最长单调上升子序列(贪心+二分)

zyzzzz / 2023-07-28 / 原文

这个的思路就是再开一个数组,存储长度为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;