A SPY in the Metro(城市裏的間諜),UVA1025【dp】

用dp[i][j]來表示時間i時在車站j所需的時間,則dp[T][n]爲0,及此時已達終點,還需等待時間爲零。而dp[T][j]爲INF(j<n),因爲此時已無法到達終點,時間爲無窮。我們根據T時刻的狀態來推知前面的狀態,最終求出dp[0][1],即第0時刻在車站1到達車站n所需的等待時間。而等待時間的來源就是後一時刻同一車站的時間加一,即dp[i][j]=dp[i+1][j]+1;核心算法摘錄自紫書。
往前遞推時有三種狀況:
1,等一分鐘,即dp[i][j]=dp[i+1][j]+1。  
2.搭上往右開的車
3.搭上往左開的車
因爲遞推情況是在車站的情況,所以不存在在車上的狀況
#include<iostream>
using namespace std;
#define INF 0x3f3f3f3f
int main() {
	int n,T,Case=1;
	while(cin>>n&&n) {
		cin>>T;
		int t[60]= {0};                                //記錄每個車站到下一站的時間
		int dp[300][60]= {0};                          //第i時刻j車站還需的等待時間
		bool has_train[300][60][2]= {0};               //判斷在i時刻j車站是否有向右或向左的車
		for(int i=1; i<n; i++)
			cin>>t[i];
		int x,ti;
		cin>>x;
		for(int i=0; i<x; i++) {
			cin>>ti;
			for(int j=0; j<n; j++) {
				ti=ti+t[j];
				has_train[ti][j+1][0]=1;
			}
		}
		cin>>x;
		for(int i=0; i<x; i++) {
			cin>>ti;
			for(int j=n; j>0; j--) {
				ti=ti+t[j];
				has_train[ti][j][1]=1;
			}
		}
		for(int i=1; i<n; 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+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]);
			}
		cout<<"Case Number "<<Case++<<": ";
		if(dp[0][1]>=INF)
			cout<<"impossible\n";
		else
			cout<<dp[0][1]<<endl;
	}

}

                       
發佈了27 篇原創文章 · 獲贊 16 · 訪問量 5795
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章