题不算难,记录路径的时候有点麻烦,需要去判断在相等的时候不用更新,然后搜回去就行了。
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 struct ele 6 { 7 int w; 8 int s; 9 int num; 10 } el[1050]; 11 int cmp(ele a,ele b) 12 { 13 return a.w<b.w; 14 } 15 int d[1050][1050],s[1050][1050],way[1050]; 16 int main() 17 { 18 int i=0,j; 19 while(scanf("%d%d",&el[i].w,&el[i].s)!=EOF) 20 i++; 21 for(int j=1;j<=i;j++) 22 el[j-1].num=j; 23 sort(el,el+i,cmp); 24 memset(d,0,sizeof(d)); 25 for(int j=0;j<i;j++) 26 { 27 for(int k=j+1;k<i;k++) 28 { 29 if(el[j].w!=el[k].w&&el[j].s>el[k].s) 30 d[j+1][k]=max(d[j][j]+1,d[j][k]); 31 else d[j+1][k]=d[j][k]; 32 if(d[j+1][k]==d[j][k]) s[j+1][k]=s[j][k]; 33 else s[j+1][k]=j; 34 } 35 36 } 37 int maxd=0,t; 38 for(j=1;j<i;j++) 39 if(d[j][j]>=maxd) 40 { 41 maxd=d[j][j]; 42 t=j; 43 } 44 if(maxd>0) 45 { 46 printf("%d ",maxd+1); 47 way[maxd]=el[t].num; 48 for(j=maxd-1;j>=0;j--) 49 { 50 way[j]=el[s[t][t]].num; 51 t=s[t][t]; 52 } 53 for(int k=0;k<=maxd;k++) 54 { 55 printf("%d ",way[k]); 56 } 57 } 58 return 0; 59 }