A Spy in the Metro UVA - 1025

本文介绍了一种使用动态规划解决列车调度问题的方法。通过逆向推理从最后一个状态向前推导所有状态,最终求解出初始状态的最优解。代码实现了列车从两个方向进出站的调度过程,并计算出最少所需时间。

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

动态规划,紫书上面已经解释很清楚了,逆向推理,从最后一个状态顺推前面全部状态,最终得到dp[0][0],再进行一轮判断即可,具体实现见如下代码:

#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<deque>
using namespace std;

int N, T;
int train[500][500][2];
int timeInter[500];
int M1, M2;
int toLeft[60],toRight[60];
int dp[500][500];

int main(){
	int Case = 1;
	while (cin >> N){
		if (N == 0) break;
		memset(train,0,sizeof(train));
		cin >> T;
		for (int i = 0; i < N-1; i++) cin >> timeInter[i];
		cin >> M1;
		for (int i = 0; i < M1; i++) cin >> toRight[i];
		cin >> M2;
		for (int i = 0; i < M2; i++) cin >> toLeft[i];
		for (int i = 0; i < M1; i++){
			int t = toRight[i];
			train[t][0][1] = 1;//时刻 车站编号  1 右
			for (int j = 0; j < N-1; j++){
				t += timeInter[j];
				train[t][j+1][1] = 1;
			}
		}
		for (int i = 0; i < M2; i++){
			int t = toLeft[i];
			train[t][N - 1][0] = 1;//0 左
			for (int j = N - 2; j >= 0; j--){
				t += timeInter[j];
				train[t][j][0] = 1;
			}
		}
		memset(dp,0,sizeof(dp));
		dp[T][N - 1] = 0;
		for (int i = 0; i < N - 1; i++) dp[T][i] = 1 << 20;
		for (int i = T - 1; i >= 0; i--){
			for (int j = 0; j < N; j++){
				dp[i][j] = dp[i+1][j] + 1;
				if (j < N - 1 && train[i][j][1] && i + timeInter[j] <= T){//right
					dp[i][j] = min(dp[i][j],dp[i+timeInter[j]][j+1]);
				}
				if (j > 0 && train[i][j][0] && i + timeInter[j-1] <= T){//left
					dp[i][j] = min(dp[i][j], dp[i + timeInter[j - 1]][j-1]);
				}
			}
		}
		cout << "Case Number "<<Case++<<": ";
		if (dp[0][0] >= (1 << 20)) cout << "impossible" << endl;
		else cout << dp[0][0] << endl;
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值