UVA1025-A Spy in the Metro-動態規劃
阿新 • • 發佈:2018-02-22
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-動態規劃