#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; struct Node{ int a,b; }; Node w[5005]; int n,len; int ldown[5005]; bool cmp(const Node &x,const Node &y){ return x.a<y.a; } int binary(int i){ int left,right,mid; left=0;right=len; while(left<right){ mid=left+(right-left)/2; if(ldown[mid]<=w[i].b) right=mid; else left=mid+1; } return left; } int main(){ int t,i,j; scanf("%d",&t); while(t--){ scanf("%d",&n); for(i=1;i<=n;i++){scanf("%d",&w[i].a);scanf("%d",&w[i].b); } sort(w+1,w+n+1,cmp); // for(i=1;i<=n;i++){printf("%d ",w[i].a);printf("%d \n",w[i].b);} //求l的最长下降序列,等于最少个上升子序列之和 ldown[1]=w[1].b; len=1; for(i=2;i<=n;i++){ if(ldown[len]>=w[i].b) ldown[++len]=w[i].b; else{ int pos; pos=binary(i); ldown[pos]=w[i].b; } } printf("%d\n",len); } }
原文:http://www.cnblogs.com/jiang2017/p/6691412.html