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\n",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\n",way[k]);
56             }
57         }
58     return 0;
59 }

 

转载于:https://www.cnblogs.com/Acgsws/p/3200203.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值