Dilworth定理的证明:http://www.cnblogs.com/nanke/archive/2011/08/11/2134355.html
感觉难理解。有空研究。
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; const int INF=100005; int n,a,f1[INF],f2[INF],top1,top2; void find(int l,int r) { if(l>r) { f1[l]=a; top1=max(top1,l); return; } int mid=(l+r)/2; if(f1[mid]>=a)find(mid+1,r); else find(l,mid-1);//////// } int main() { f1[0]=INF; while(scanf("%d",&a)==1) { if(a<=f1[top1])f1[++top1]=a; else find(1,top1); if(a>f2[top2])f2[++top2]=a; else { int k=lower_bound(f2+1,f2+top2+1,a)-f2; f2[k]=a; } } printf("%d %d",top1,top2); return 0; }