动态规划--uva1025 城市里的间谍

本文介绍了一种使用动态规划来解决列车调度问题的方法。通过定义状态转移方程,考虑了从不同车站出发的选择,包括等待、向右或向左乘坐列车等决策,最终求得从起点到终点的最短等待时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

影响决策的因素有当前时间t和所处车站,所以dp[t][n],2维。

求等待最短时间,即dp[t][n]

决策有3个,等待1分钟,向右坐火车,向左坐火车。


#include <iostream>

#include <cstdio>

#include <cstring>

using namespacestd;

const int maxn =255;

const int INF =1 << 25;


int dis[55];

int d[maxn],e[maxn];

bool has_train[maxn][55][2];

int dp[maxn][55];

int n,t,m1,m2;

void f()

{

    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 +dis[j] <= t)

            {

                dp[i][j] =min(dp[i][j],dp[i +dis[j]][j + 1]);

            }

            if(j >1 && has_train[i][j][1] && i +dis[j - 1] <=t)

            {

                dp[i][j] =min(dp[i][j],dp[i +dis[j - 1]][j -1]);

            }

        }

    }

}

int main()

{

    int kce =0;

    while (cin >>n && n) {

        memset(dis,0, sizeof(dis));

        memset(has_train,0, sizeof(has_train));

        memset(d,0, sizeof(d));

        memset(e,0, sizeof(e));

        memset(dp,0, sizeof(dp));

        cin >>t;

        for (int i =1; i <= n -1; i ++) {

            scanf("%d",&dis[i]);

        }

        cin >>m1;

        for (int i =1; i <= m1; i ++) {

            scanf("%d",&d[i]);

        }

        cin >>m2;

        for (int i =1; i <= m2; i ++) {

            scanf("%d",&e[i]);

        }

        for (int i =1; i <= m1; i ++) {

            int tmp =d[i];

            for (int j =1; j < n; j ++) {

                has_train[tmp][j][0] =true;

              //  cout << "when time  " << tmp<< " at station " << j <<" has train to right" << endl;

                tmp += dis[j];

            }

        }

        for (int i =1; i <= m2; i ++) {

            int tmp =e[i];

            for (int j =n; j > 1; j --) {

                has_train[tmp][j][1] =true;

               //  cout << "when time  " << tmp<< " at station " << j <<" has train to left" << endl;

                tmp += dis[j -1];

            }

        }

        f();


        cout <<"Case Number " << ++kce <<": " ;

        if (dp[0][1] >= INF) {

            cout <<"impossible\n";

        }

        elsecout << dp[0][1] <<endl;

            }

    return0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值