描述略
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int d[205][55];//时刻i在车站j,至少等多久
int train[205][55][2];//时刻i在车站j,是否有车
int tp[55];//车站间隔
const int INF = 1000000;
int main(){
//freopen("d://poj//data.txt","w",stdout);
int n,t,i,j,m1,m2,flag,sum;
int ca = 0;
while(scanf("%d",&n) && n){
memset(train,0,sizeof(train));
//fill(d[0],d[0] + 205 * 55,INF);
++ca;
scanf("%d",&t);
tp[0] = 0;
for(i = 1;i < n; ++i)
scanf("%d",tp + i);
scanf("%d",&m1);
for(i = 0;i < m1; ++i){
scanf("%d",&sum);
while(sum <= t){
for(j = 0;sum <= t && j < n - 1;++j){
sum += tp[j];
train[sum][j][0] = 1;
}
break;
// for(j = n - 1;sum <= t && j > 0; --j){
// train[sum][j][1] = 1;
// sum += tp[j];
// }
}
}
scanf("%d",&m2);
for(i = 0;i < m2; ++i){
scanf("%d",&sum);
while(sum <= t){
for(j = n - 1;sum <= t && j > 0;--j){
train[sum][j][1] = 1;
sum += tp[j];
}
break;
// for(j = 0;sum <= t && j < n - 1; ++j){
// sum += tp[j];
// train[sum][j][0] = 1;
// }
}
}
for(i = 0;i < n - 1; ++i)//dp来自紫书,哎~
d[t][i] = INF;
d[t][n - 1] = 0;
for(i = t - 1;i >= 0; --i){
for(j = 0;j < n; ++j){
d[i][j] = d[i + 1][j] + 1;
if(j < n - 1 && train[i][j][0] && i + tp[j + 1] <= t)
d[i][j] = min(d[i][j],d[i + tp[j + 1]][j + 1]);
if(j > 0 && train[i][j][1] && i + tp[j] <= t)
d[i][j] = min(d[i][j],d[i + tp[j]][j - 1]);
}
}
printf("Case Number %d: ",ca);
if(d[0][0] >= INF)
printf("impossible\n");
else
printf("%d\n",d[0][0]);
}
return 0;
}
Trains move in both directions: from the first station to the last station and from the last station back to the first station.
结果题目火车™是单程的?
当然此题中心还是状态的抽象以及状态转移方程:
开始是在t时到达n战时没有等待时间,求最开始最初站的等待时间。以时间为序列,向前递推状态转移有三种方式 等待一分钟(前一状态等待时间加一) 向右有车 向左有车。取最少等待时间。