#include <iostream> #include <cstring> #include <cmath> #include <algorithm> #include <cstdio> #include <stack> using namespace std; struct node { int w; int s; int pre; int x; } a[1009],b[1009]; int cmp(node a,node b) { if(a.w==b.w) return a.s>b.s; else if(a.s==b.s) a.w<b.w; else return a.w<b.w; } int dp[1009]; int main() { int i,j,k,n,maxx=-1; i=1; n=0; while(~scanf("%d%d",&a[i].w,&a[i].s)) { a[i].x=i; a[i].pre=-1; i++; n++; } //printf("n==%d\n",n); sort(a+1,a+n+1,cmp); /*for(i=1;i<=n;i++) { //printf("i==%d : %d %d\n",i,a[i].w,a[i].s); }*/ for(i=1; i<=n; i++) { dp[i]=1; for(j=1; j<=i-1; j++) { if(a[j].w<a[i].w&&a[j].s>a[i].s) { if(dp[i]<dp[j]+1) { dp[i]=dp[j]+1; a[i].pre=j; } } } if(maxx<dp[i]) { maxx=dp[i]; k=i; } } stack<int>q; printf("%d\n",maxx); while(k!=-1) { q.push(a[k].x); k=a[k].pre; } while(!q.empty()) { printf("%d\n",q.top()); q.pop(); } }/* 9 6008 1300 6000 2100 500 2000 1000 4000 1100 3000 6000 2000 8000 1400 6000 1200 2000 1900 */
排个序,做好标记就可以了。