• UVa 1025 (动态规划) A Spy in the Metro


    题意:

    有线性的n个车站,从左到右编号分别为1~n。有M1辆车从第一站开始向右开,有M2辆车从第二站开始向左开。在0时刻主人公从第1站出发,要在T时刻回见车站n 的一个间谍(忽略主人公的换乘时间)。输出最少的等待时间,如果无解输出impossible。

    分析:

    d(i, j)表示第i时刻在第j个车站,最少还需要的等待时间。边界是:d(T, n) = 0, d(T, i) = +∞

    预处理:

    has_train[t][i][0]数组是用来记录t时刻第i个车站是否有向右开的车,类似has_train[t][i][1]记录的是向左开的车。

    有3种决策:

    1. 等一分钟
    2. 搭乘向左开的车(如果有的话)
    3. 搭乘向右开的车(如果有的话)

    边界没有处理到位,WA了好多次。

     1 //#define LOCAL
     2 #include <iostream>
     3 #include <cstdio>
     4 #include <cstring>
     5 using namespace std;
     6 
     7 const int INF = 1000000000;
     8 int has_train[255][55][2], t[55], dp[255][55];
     9 
    10 int main(void)
    11 {
    12     #ifdef LOCAL
    13         freopen("1025in.txt", "r", stdin);
    14     #endif
    15 
    16     int kase = 0, n, T;
    17     while(scanf("%d", &n) == 1 && n)
    18     {
    19         scanf("%d", &T);
    20         for(int i = 1; i < n; ++i)    dp[T][i] = INF;
    21         dp[T][n] = 0;
    22         memset(has_train, 0, sizeof(has_train));
    23 
    24         for(int i = 1; i < n; ++i)    scanf("%d", &t[i]);
    25         int m, ti;
    26         scanf("%d", &m);
    27         while(m--)
    28         {
    29             scanf("%d", &ti);
    30             for(int i = 1; i < n; ++i)
    31             {
    32                 if(ti <= T)    has_train[ti][i][0] = 1;
    33                 ti += t[i];
    34             }
    35         }
    36         scanf("%d", &m);
    37         while(m--)
    38         {
    39             scanf("%d", &ti);
    40             for(int j = n-1; j >= 1; --j)
    41             {
    42                 if(ti <= T)    has_train[ti][j + 1][1] = 1;
    43                 ti += t[j];
    44             }
    45         }
    46 
    47         for(int i = T - 1; i >= 0; --i)
    48         {
    49             for(int j = 1; j <= n; ++j)
    50             {
    51                 dp[i][j] = dp[i+1][j] + 1;
    52                 if(j < n && has_train[i][j][0] && i + t[j] <= T)
    53                     dp[i][j] = min(dp[i][j], dp[i + t[j]][j+1]);
    54                 if(j > 1 && has_train[i][j][1] && i + t[j-1] <= T)
    55                     dp[i][j] = min(dp[i][j], dp[i + t[j-1]][j-1]);
    56             }
    57         }
    58 
    59         printf("Case Number %d: ", ++kase);
    60         if(dp[0][1] >= INF)    puts("impossible");
    61         else    printf("%d
    ", dp[0][1]);
    62     }
    63 
    64     return 0;
    65 }
    代码君
  • 相关阅读:
    WPF通过不透明蒙板切割显示子控件
    WPF图片,DataGrid等实现圆角
    今天是2015年1月5日
    控制反转&依赖注入
    如何提高sql查询性能到达优化程序的目的
    handle句柄
    winform加快窗体加载速度
    winform窗体自适应大小
    快速整理代码(c#)
    IC卡、ID卡、M1卡、射频卡的区别是什么(射频卡是种通信技术)
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/3999134.html
Copyright © 2020-2023  润新知