• UVa-1025城市里的间谍 A Spy in the Metro


    原题

    城市里的间谍

    分析

    动态规划,dp[i][j]表示你在时刻i,车站j,最少还要等待的时间. 边界条件d[T][n]=0 已经到达,其他d[T][i]=inf不可达.

    在一个站点时,有以下三种决策:

    1. 等一分钟
    2. 搭乘往左开的车(前提是有)
    3. 搭乘往右开的车

    AC代码

    #include "bits/stdc++.h"
    using namespace std;
    
    const int maxn = 50 + 5;
    const int maxt = 200 + 5;
    const int INF = 1000000000;
    
    // has_train[t][i][0]表示时刻t,在车站i是否有往右开的火车
    int t[maxn], has_train[maxt][maxn][2];
    int dp[maxt][maxn];
    
    int main() {
      int kase = 0, n, T;
      while(cin >> n && n) {
        cin >>T ;
        int M1, M2, d;
        for(int i = 1; i <= n-1; i++) cin >> t[i];
    
        // 预处理,计算has_train数组
        memset(has_train, 0, sizeof(has_train));
        cin >> M1;
        while(M1--) {
          cin >> d;//针对每一俩车,更新它到车站的时间
          for(int j = 1; j <= n-1; j++) {
            if(d <= T) has_train[d][j][0] = 1;
            d += t[j];
          }
        }
        cin >> M2;
        while(M2--) {
          cin >> d;
          for(int j = n-1; j >= 1; j--) {
            if(d <= T) has_train[d][j+1][1] = 1;
            d += t[j];
          }
        }
    
        // DP主过程
        for(int i = 1; i <= n-1; i++) dp[T][i] = INF; //不可达
        dp[T][n] = 0; //已达
    
        for(int i = T-1; i >= 0; i--)
          for(int j = 1; j <= n; j++) {
            dp[i][j] = dp[i+1][j] + 1; // 等待一个单位
            if(j < n && has_train[i][j][0] && i+t[j] <= T)
              dp[i][j] = min(dp[i][j], dp[i+t[j]][j+1]); // 右
            if(j > 1 && has_train[i][j][1] && i+t[j-1] <= T)
              dp[i][j] = min(dp[i][j], dp[i+t[j-1]][j-1]); // 左
          }
    
        // 输出
        cout << "Case Number " << ++kase << ": ";
        if(dp[0][1] >= INF) cout << "impossible
    ";
        else cout << dp[0][1] << "
    ";
      }
      return 0;
    }
    
    
    转载请保留原文链接及作者
    本文标题:
    文章作者: LepeCoder
    发布时间:
    原始链接:
  • 相关阅读:
    python基础
    c# String ,String[] 和 List<String>之间的转换
    c#上位机与三菱PLC(FX3U)串口通讯
    Convert.ToInt32()和int.Parse()区别
    代码走查25条疑问
    前后端分离-django主机管理开发二
    前后端分离-django主机管理开发一
    django图书管理系统一
    力扣题目练习一
    ELK实战-kibana安装使用
  • 原文地址:https://www.cnblogs.com/lepeCoder/p/Uva-1025.html
Copyright © 2020-2023  润新知