UVa10131

题不算难,记录路径的时候有点麻烦,需要去判断在相等的时候不用更新,然后搜回去就行了。

 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 }
原文地址:https://www.cnblogs.com/Acgsws/p/3200203.html