紫書uva1025 A Spy in the Metro(dp)
阿新 • • 發佈:2019-01-12
難受啊,dp的時候多寫了else,傻了,站臺肯定有可能同時左右方向一起來車啊
has_train[i][j][],第i分鐘,j站臺,是否有向右(0)/向左(1)開的車
dp[i][j],第i分鐘,在j站臺最少還需要等候多長時間
三種狀態
1.等一分鐘
2.接下來向右開
3.接下來向左開
程式碼已AC
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; int n,T,t[60],m1,d[60],m2,e[60],cnt; int dp[220][60]; int has_train[220][60][2]; int main() { while(~scanf("%d",&n)&&n) { cnt++; memset(has_train,0,sizeof(has_train)); for(int i=0;i<220;i++) for(int j=0;j<60;j++) dp[i][j]=inf; scanf("%d",&T); for(int i=1;i<n;i++) scanf("%d",&t[i]); scanf("%d",&m1);//向右開 for(int i=0;i<m1;i++) { scanf("%d",&d[i]); int s=d[i]; has_train[s][1][0]=1; for(int j=1;j<n;j++) { s+=t[j]; has_train[s][j+1][0]=1; } } scanf("%d",&m2);//向左開 for(int i=0;i<m2;i++) { scanf("%d",&e[i]); int s=e[i]; has_train[s][n][1]=1; for(int j=n-1;j>=1;j--) { s+=t[j]; has_train[s][j][1]=1; } } 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((i+t[j])<=T&&j<n&&has_train[i][j][0])//i分鐘,j站臺,之後向右走 dp[i][j]=min(dp[i][j],dp[i+t[j]][j+1]); if((i+t[j-1])<=T&&j>1&&has_train[i][j][1]) dp[i][j]=min(dp[i][j],dp[i+t[j-1]][j-1]); } // for(int j=1;j<=n;j++) // printf("%d ",dp[i][j]); // printf("\n"); } printf("Case Number %d: ",cnt); if(dp[0][1]<inf) printf("%d\n",dp[0][1]); else printf("impossible\n"); } return 0; }