1025 - A Spy in the Metro

经典dp

时间单向流动,是一个天然的序列,影响到决策的只有时间和所处的车站,所以用dp[i][j]表示在i时刻你在j车站,最少还需要等待多长时间。

状态就是时间和车站序号,状态转移方程就是  1、如果在该时刻该车站没有列车,等待时间+1;2、如果有向右开的列车dp[i][j] = min(dp[i][j],dp[i+t[j]][j+1]); 有两个选择,不乘坐或者乘坐;3、与2相似

#include<bits/stdc++.h>
using namespace std;
const long long INF = 1000000;
int dp[205][55];
int N,T,t[100],M1,M2,kase = 0;
bool has_train[300][100][5];
int main() {
    while(scanf("%d",&N)!=EOF&&N) {
        memset(dp,0,sizeof(dp));
        memset(t,0,sizeof(t));
        scanf("%d",&T);
        for(int i=1;i<=N-1;i++) { scanf("%d",&t[i]); dp[T][i] = INF; }
        scanf("%d",&M1);
        int tt;
        memset(has_train,false,sizeof(has_train));
        for(int i=0;i<M1;i++) {
            scanf("%d",&tt);
            for(int j=1;j<=N-1;j++) {
                has_train[tt][j][0] = true;
                tt+=t[j];
            }
        }
        scanf("%d",&M2);
        for(int i=0;i<M2;i++) {
            scanf("%d",&tt);
            for(int j=N-1;j>=1;j--) {
                has_train[tt][j+1][1] = true;
                tt+=t[j];
            }
        }
        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]);
        }
        printf("Case Number %d: ",++kase);
        if(dp[0][1] >= INF) printf("impossible\n");
        else printf("%d\n",dp[0][1]);
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值