メトロでUVA#1025Aスパイ

少し説明

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int d[205][55];//时刻i在车站j,至少等多久
int train[205][55][2];//时刻i在车站j,是否有车
int tp[55];//车站间隔
const int INF = 1000000;
int main(){
	//freopen("d://poj//data.txt","w",stdout);
	int n,t,i,j,m1,m2,flag,sum;
	int ca = 0;
	while(scanf("%d",&n) && n){
		memset(train,0,sizeof(train));
		//fill(d[0],d[0] + 205 * 55,INF);
		++ca;
		scanf("%d",&t);
		tp[0] = 0;
		for(i = 1;i < n; ++i)
			scanf("%d",tp + i);
		scanf("%d",&m1);
		for(i = 0;i < m1; ++i){
			scanf("%d",&sum);
			while(sum <= t){
				for(j = 0;sum <= t && j < n - 1;++j){
					sum += tp[j];
					train[sum][j][0] = 1;
				}
				break;
//				for(j = n - 1;sum <= t && j > 0; --j){
//					train[sum][j][1] = 1;
//					sum += tp[j];
//				}
			}
		}
		scanf("%d",&m2);
		for(i = 0;i < m2; ++i){
			scanf("%d",&sum);
			while(sum <= t){
				for(j = n - 1;sum <= t && j > 0;--j){
					train[sum][j][1] = 1;
					sum += tp[j];
				}
				break;
//				for(j = 0;sum <= t && j < n - 1; ++j){
//					sum += tp[j];
//					train[sum][j][0] = 1;
//				}
			}
		}
		for(i = 0;i < n - 1; ++i)//dp来自紫书,哎~
			d[t][i] = INF;
		d[t][n - 1] = 0;
		for(i = t - 1;i >= 0; --i){
			for(j = 0;j < n; ++j){
				d[i][j] = d[i + 1][j] + 1;
				if(j < n - 1 && train[i][j][0] && i + tp[j + 1] <= t)
					d[i][j] = min(d[i][j],d[i + tp[j + 1]][j + 1]);
				if(j > 0 && train[i][j][1] && i + tp[j] <= t)
					d[i][j] = min(d[i][j],d[i + tp[j]][j - 1]);
			}
		}
		printf("Case Number %d: ",ca);
		if(d[0][0] >= INF)
			printf("impossible\n");
		else
			printf("%d\n",d[0][0]);
	}
	return 0;
}

列車から:.両方の方向に移動する最初の駅最後のステーションへと最後の駅の裏から最初のステーションへの
結果™対象列車です一方向のですか?
もちろん、この抽象と状態の状態遷移方程式や中心的な問題は:
最初に時間を待っている最も独創駅開始のために、戦争で何の待機時間tを到着していないn個。時系列では、3つの方法で1分間前方再帰の状態遷移(前回プラス待機状態)が右の車に車を残しています。最小の待機時間を取ります。

公開された53元の記事 ウォンの賞賛0 ビュー716

おすすめ

転載: blog.csdn.net/weixin_38894974/article/details/104643222