这题说的是给了n个车站 从1号 车站到 n号车站,有m1辆车从1 开往n 有m2 辆车从n 开往1 一个人从1 车站 到达n 车站在T 时刻 要求再 车站呆的时间尽量少
dp[i][j] 表示 在 第i 个车站 j 时刻的 状态 他会从 dp[i][j-1]+1 和j 时刻有到i的火车经过的点来, 这样我们通过计算在j时候有什么火车到达i就可以了
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> using namespace std; int dp[55][250]; int dd[55]; int t[2][55]; int D[2][55]; void inti(int n, int t){ for(int i=0; i<n; ++i) for(int j=0; j<=t; ++j) dp[i][j]=t+1; } int main() { int N,T,cas=1; while(scanf("%d",&N)==1&&N){ scanf("%d",&T); for(int i=1; i<N; ++i) scanf("%d",&dd[i]); t[0][0]=0; for(int i=1; i<N; ++i) t[0][i]=t[0][i-1]+dd[i]; t[1][N-1]=0; for(int i=N-2; i>=0; --i) t[1][i]=t[1][i+1]+dd[i+1]; int m1; scanf("%d",&m1); for(int i=0; i<m1; ++i){ scanf("%d",&D[0][i]); } int m2; scanf("%d",&m2); for(int i=0; i<m2; ++i) scanf("%d",&D[1][i]); inti(N,T); dp[0][0]=0; for(int i=1; i<=T; ++i){ if(i==15) { int ddddddd=1; } for(int j=0; j<N; ++j){ dp[j][i]=min(dp[j][i],dp[j][i-1]+1); for(int e=0; e<m1; e++) if( D[0][e]+t[0][j]==i&&j!=0){ for(int k=0; k<j; ++k) dp[j][i]=min(dp[j][i],dp[ k ][ D[0][e]+t[0][k] ]); } for(int e=0; e<m2; e++){ if(D[1][e]+t[1][j]==i&&j!=(N-1) ){ for(int k=N-1; k>j; --k) dp[j][i]=min(dp[j][i],dp[ k ][ D[1][e] +t[1][k] ]); } } } } printf("Case Number %d: ",cas++); if(dp[N-1][T]>T){ puts("impossible"); }else{ printf("%d\n",dp[N-1][T]); } } return 0; }
时间: 2024-10-26 23:54:35