最長不下降子序列(可以改成最長上升子序列)
阿新 • • 發佈:2019-02-08
#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; }