和poj1631一样的思路。连代码都99%相似了...
#include<iostream> #include<cstdio> using namespace std; #define maxn 1005 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,i,p; scanf("%d",&n); ans=1;scanf("%d",&stack[0]); for(i=1;i<n;i++) { scanf("%d",&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); }