参考:http://hi.baidu.com/%8E%E1%D0%B3/blog/item/2ddd6eca3357701a7f3e6f9d.html 用栈模拟求最长上升子序列! #include<iostream> #include<cstdio> using namespace std; #define maxn 40005 int stack[maxn],ans; int research(int l,int r,int p) { if(r==l) return r; int mid=(l+r)>>1; if(p<stack[mid]) return research(l,mid,p); else return research(mid+1,r,p); } int main() { int n,ca,p; cin>>ca; while(ca-->0) { cin>>n;ans=0;cin>>stack[ans++];n--; while(n-->0) { cin>>p; if(p>stack[ans-1]) stack[ans++]=p; else { int mid=research(0,ans-1,p); if(p<stack[mid]) stack[mid]=p; else stack[mid+1]=p; } } printf("%d/n",ans); } }