zoukankan      html  css  js  c++  java
  • hdu 1224【Free DIY Tour】

    如果从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 }
  • 相关阅读:
    洛谷——P1141 01迷宫
    洛谷——P1781 宇宙总统
    洛谷——P1608 路径统计
    洛谷——P1144 最短路计数
    洛谷—— P1162 填涂颜色
    python(22)- 递归和函数式编程
    android驱动例子(LED灯控制)
    Android之SDK、NDK、JNI和so文件
    NDK 与 JNI 的关系
    Android之NDK开发
  • 原文地址:https://www.cnblogs.com/Shirlies/p/2643037.html
Copyright © 2011-2022 走看看