1. 程式人生 > >UVA1025-A Spy in the Metro-動態規劃

UVA1025-A Spy in the Metro-動態規劃

https str 結果 cstring algorithm eof possible 還需要 ++

A Spy in the Metro

題意:一人要從一號車站做車去n號車站,輸入每兩個車站間的通過時間,和兩頭火車的出發時間,求這個人最少要在車站等多久;

思路:動態規劃,僅考慮當前時間和所在車站對結果的影響,dp【T】【i】 表示最少還需要等待多長時間;

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

const int maxn = 55;
const int INF = 0x3f3f3f;
int n,T;
int t[maxn];
int m1,m2;
int train0[55],train1[55],has_train[205][55][2]; int dp[205][55]; int main(){ int kase=0; while(~scanf("%d",&n)) { memset(has_train,0,sizeof(has_train)); memset(dp,0,sizeof(dp)); if(n==0)break; scanf("%d",&T); for(int i = 1; i <= n-1; i++) scanf(
"%d",&t[i]); scanf("%d",&m1); for(int i = 1; i <= m1; i++)scanf("%d",&train0[i]); scanf("%d",&m2); for(int i = 1; i <= m2; i++)scanf("%d",&train1[i]); for(int i = 1; i <= m1; i++) { int tmp = train0[i];
int id = 1; while(tmp <= T) { has_train[tmp][id][0]=1; tmp+=t[id]; id++; if(id>=n)break; } } for(int i = 1; i <= m2; i++) { int tmp = train1[i]; int id = n; //一開始這裏寫成n-1一直wa; while(tmp <= T) { has_train[tmp][id][1]=1; tmp+=t[id-1]; id--; if(id<=1)break; } } for(int i=1;i<=n-1;i++) dp[T][i] = INF; dp[T][n] = 0; for(int i = T-1; i>=0; i--) //dp核心! { 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) //has_train[][]表示第i秒在第j個車站是否有火車經過,有->把這個車站的等待時間接到前一個; 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]); } } if(dp[0][1]<INF) printf("Case Number %d: %d\n",++kase,dp[0][1]); else printf("Case Number %d: impossible\n",++kase); } return 0; }

UVA1025-A Spy in the Metro-動態規劃