UVA1025 - A Spy in the Metro

用d[i][j]表示在时刻i,车站j的最少等待时间
有三种决策:
1.等一分钟
2.乘往左开的车
3.乘往右开的车
这三种情况下算处的d[i][j]取最小值

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <map>
#include <vector>
using namespace std;

#define INF 1 << 30
int has_train[255][55][2];
int dp[255][55];
int tim[55];
int main()
{
   // freopen("in.txt", "r", stdin);
    int n, t, cas = 0;

    while(cin >> n && n)
    {
        memset(has_train, 0, sizeof(has_train));
        cin >> t;
        for(int i = 1; i <= n-1; i++)
            cin >> tim[i];
        int k;
        cin >> k;
        for(int i = 0; i < k; i++)
        {
            int a, s;
            cin >> a;
            s = a;
            has_train[a][1][0] = 1;
            for(int j = 1; j <= n-1; j++)
            {
                if(tim[j]+s > t)
                    break;
                has_train[tim[j]+s][j+1][0] = 1;
                s += tim[j];
            }
        }
        cin >> k;
        for(int i = 0; i < k; i++)
        {
            int a, s;
            cin >> a;
            s = a;
            has_train[a][n][1] = 1;
            for(int j = n-1; j >= 1; j--)
            {
                if(tim[j] + s > t)
                    break;
                has_train[tim[j]+s][j][1] = 1;
                s += tim[j];
            }
        }
        dp[t][n] = 0;
        for(int i = 1; i < n; i++)
            dp[t][i] = INF;
        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 + tim[j] <= t)
                dp[i][j] = min(dp[i][j], dp[i+tim[j]][j+1]);
            if(j > 1 && has_train[i][j][1] && i + tim[j-1] <= t)
                dp[i][j] = min(dp[i][j], dp[i+tim[j-1]][j-1]);
        }
        printf("Case Number %d: ", ++cas);
        if(dp[0][1] >= INF)
            cout << "impossible" << endl;
        else
            cout << dp[0][1] << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值