少し説明
#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;
}
列車から:.両方の方向に移動する最初の駅最後のステーションへと最後の駅の裏から最初のステーションへの
結果™対象列車です一方向のですか?
もちろん、この抽象と状態の状態遷移方程式や中心的な問題は:
最初に時間を待っている最も独創駅開始のために、戦争で何の待機時間tを到着していないn個。時系列では、3つの方法で1分間前方再帰の状態遷移(前回プラス待機状態)が右の車に車を残しています。最小の待機時間を取ります。