1. 程式人生 > >最長不下降子序列(可以改成最長上升子序列)

最長不下降子序列(可以改成最長上升子序列)

#include<bits/stdc++.h>
#define maxn 101111
using namespace std;
int a[maxn],b[maxn];
int Search(int num,int low,int high) {
    int mid;
    while(low<=high) {
        mid=(low+high)/2;
        if(num>=b[mid]) low=mid+1;
        else high=mid-1;
    }
    return low;
}
int DP(int n) {
    int i,len,pos;
    b[1]=a[1];
    len=1;
    for(int i=2;i<=n;i++) {
        if(a[i]>=b[len]) {
            len=len+1;
            b[len]=a[i];
        }
        else {
            pos=Search(a[i],1,len);
            b[pos]=a[i];
        }
    }
    return len;
}
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--) {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        int ans=DP(n);
        cout <<  ans <<endl;
    }
    return 0;
}