Shirlies
宁静专注认真的程序媛~

如果从i->j有路的话,dp[j] = max(dp[j],dp[i]+value[j]),并记录下path[j],如果选择的是dp[i]+value[j],则path[j] = i;之后回溯就可以找到所有路径了……其实这一题可以用压缩版的数组(其实一维数组啦)存储是否有路径,可以节约一半的空间(因为一个地方只有到另外一个编号比它大的城市的路),为了方便我还是用的二维数组^_^

代码如下:
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 
 5 int dp[105];
 6 char map[105][105];
 7 int path[105];
 8 int value[105];
 9 
10 int main()
11 {
12     int cases;
13     int n;
14     int cas = 1;
15 
16     scanf("%d",&cases);
17     while(cases --)
18     {
19         scanf("%d",&n);
20         value[n+1] = 0;
21         for(int i = 1;i <= n;i ++)
22         {
23             scanf("%d",&value[i]);
24         }
25 
26         int m;
27         scanf("%d",&m);
28         memset(map,false,sizeof(map));
29         for(int i = 0;i < m;i ++)
30         {
31             int p,r;
32             scanf("%d%d",&p,&r);
33             map[p][r] = true;
34         }
35         memset(dp,0,sizeof(dp));
36 
37         for(int i = 1;i <= n + 1;i ++)
38         {
39             for(int j = i + 1;j <= n + 1;j ++)
40             {
41                 if(map[i][j])
42                 {
43                     if(dp[i] + value[j] > dp[j])
44                     {
45                         dp[j] = dp[i] + value[j];
46                         path[j] = i;
47                     }
48                 }
49             }
50         }
51         if(cas > 1)
52             printf("\n");
53         printf("CASE %d#\n",cas ++);
54         printf("points : %d\n",dp[n+1]);
55         int ans[105];
56         int i = n+1;
57         int step = 0;
58         while(i != 1)
59         {
60             ans[step] = path[i];
61             i = path[i];
62             step ++;
63         }
64         printf("circuit : ");
65         for(int j = step - 1;j>= 0;j --)
66         {
67             printf("%d->",ans[j]);
68         }
69         printf("1\n");
70     }
71 
72     return 0;
73 }
posted on 2012-08-16 20:54  Shirlies  阅读(221)  评论(0编辑  收藏  举报