最长上升序列+路径打印
#include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<cmath> #include<cstring> #include<algorithm> #include<map> #include<set> #include<queue> #include<vector> using namespace std; int d[1005],f[1005]; struct node { int x,y; int num; }a[1005]; bool cmp(const node& a1,const node& a2) { return a1.y<a2.y; } int main() { int i,j,n,res,t; // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); //scanf("%d",&n); i=0; while(scanf("%d%d",&a[i].x,&a[i].y)!=EOF) { a[i].num=i; f[i]=i; i++; } n=i; res=0; sort(a,a+n,cmp); // printf("\n"); // for(i=0;i<n;i++) // printf("%d %d\n",a[i].x,a[i].y); for(i=0;i<n;i++){ d[i]=1; for(j=0;j<i;j++) { if(a[i].x<a[j].x&&d[j]+1>d[i]&&a[i].y>a[j].y){ d[i]=d[j]+1; f[a[i].num]=a[j].num; } if(d[i]>res){ res=d[i]; t=i; } } } // for(i=0;i<n;i++) // printf("%d ",d[i]); // printf("\n"); //for(i=0;i<n;i++) // printf("%d ",f[i]); printf("%d\n",res); int x=a[t].num; while(res--) { printf("%d\n",x+1); x=f[x]; } return 0; }