zoukankan      html  css  js  c++  java
  • HDU 1224 Free DIY Tour

    题意:给出每个城市interesting的值,和城市之间的飞行路线,求一条闭合路线(从原点出发又回到原点)

    使得路线上的interesting的值之和最大

    因为要输出路径,所以用pre数组来保存前驱

    在输出路径的时候,我是把前驱一次放在route数组里面,然后再将整个数组反转过来

    另外,看别人的题解里面还有一种递归的方法求路径,挺有新意,学习了

    我的做法:

     1 //#define LOCAL
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int maxn = 5100;
     9 bool flight[110][110];
    10 int city[110];
    11 int dp[110];
    12 int pre[110];
    13 int route[110];
    14 
    15 int main(void)
    16 {
    17     #ifdef LOCAL
    18         freopen("1224in.txt", "r", stdin);
    19     #endif
    20 
    21     int N, kase;
    22     scanf("%d", &N);
    23     for(kase = 1; kase <= N; ++kase)
    24     {
    25         if(kase > 1)    printf("
    ");
    26 
    27         int n;
    28         scanf("%d", &n);
    29         int i;
    30         for(i = 1; i <= n; ++i)
    31             scanf("%d", &city[i]);
    32         city[n + 1] = 0;
    33         
    34         int m, from, to;
    35         memset(flight, 0, sizeof(flight));
    36         scanf("%d", &m);
    37         for(i = 1; i <= m; ++i)
    38         {
    39             scanf("%d%d", &from, &to);
    40             flight[from][to] = true;
    41         }
    42 
    43         memset(dp, 0, sizeof(dp));
    44         memset(pre, 0, sizeof(pre));
    45         int j;
    46         for(i = 2; i <= n + 1; ++i)
    47             for(j = 1; j < i; ++j)
    48                 if(flight[j][i]
    49                     && (dp[j] + city[i]) > dp[i])
    50                 {
    51                     dp[i] = dp[j] + city[i];
    52                     pre[i] = j;
    53                 }
    54                     
    55         
    56         printf("CASE %d#
    ", kase);
    57         printf("points : %d
    ", dp[n + 1]);
    58         int p = n + 1, len = 0;
    59         while(pre[p] != 0)
    60         {
    61             route[len++] = pre[p];
    62             p = pre[p];
    63         }
    64         for(i = 0; i < len / 2; ++i)
    65         {
    66             int t = route[i];
    67             route[i] = route[len - i -1];
    68             route[len - i -1] = t;
    69         }
    70         
    71         printf("circuit : ");
    72         for(i = 0; i < len; ++i)
    73             printf("%d->", route[i]);
    74         printf("1
    ");
    75     }
    76 
    77     return 0;
    78 }
    代码君

    别人递归回溯输出路径的做法:

     1 //#define LOCAL
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 #include <algorithm>
     6 using namespace std;
     7 
     8 const int maxn = 5100;
     9 bool flight[110][110];
    10 int city[110];
    11 int dp[110];
    12 int pre[110];
    13 int route[110];
    14 
    15 void putroute(int p)
    16 {
    17     if(p == 0)
    18         return;
    19     putroute(pre[p]);
    20     printf("%d->", p);
    21 }
    22 
    23 int main(void)
    24 {
    25     #ifdef LOCAL
    26         freopen("1224in.txt", "r", stdin);
    27     #endif
    28 
    29     int N, kase;
    30     scanf("%d", &N);
    31     for(kase = 1; kase <= N; ++kase)
    32     {
    33         if(kase > 1)    printf("
    ");
    34 
    35         int n;
    36         scanf("%d", &n);
    37         int i;
    38         for(i = 1; i <= n; ++i)
    39             scanf("%d", &city[i]);
    40         city[n + 1] = 0;
    41         
    42         int m, from, to;
    43         memset(flight, 0, sizeof(flight));
    44         scanf("%d", &m);
    45         for(i = 1; i <= m; ++i)
    46         {
    47             scanf("%d%d", &from, &to);
    48             flight[from][to] = true;
    49         }
    50 
    51         memset(dp, 0, sizeof(dp));
    52         memset(pre, 0, sizeof(pre));
    53         int j;
    54         for(i = 2; i <= n + 1; ++i)
    55             for(j = 1; j < i; ++j)
    56                 if(flight[j][i]
    57                     && (dp[j] + city[i]) > dp[i])
    58                 {
    59                     dp[i] = dp[j] + city[i];
    60                     pre[i] = j;
    61                 }
    62                     
    63         
    64         printf("CASE %d#
    ", kase);
    65         printf("points : %d
    ", dp[n + 1]);
    66 
    67         printf("circuit : ");
    68         putroute(pre[n + 1]);
    69         printf("1
    ");
    70     }
    71 
    72     return 0;
    73 }
    代码君
  • 相关阅读:
    1058 A+B in Hogwarts (20)
    1046 Shortest Distance (20)
    1061 Dating (20)
    1041 Be Unique (20)
    1015 Reversible Primes (20)(20 分)
    pat 1027 Colors in Mars (20)
    PAT 1008 Elevator (20)
    操作系统 死锁
    Ajax的get方式传值 避免& 与= 号
    让IE浏览器支持CSS3表现
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/3864947.html
Copyright © 2011-2022 走看看