题目:http://www.luogu.org/problem/show?pid=2583#
分析:DP.当前站有3个选择:等、向左、向右
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Tmax=1005,Tmax2=1005,inf=0x3f3f3f3f;
int n,T,m,w[Tmax],f[Tmax2][Tmax],Time[Tmax2][Tmax][2];
void init()
{
int i,j,start;
memset(f,0x3f,sizeof(f));
memset(Time,false,sizeof(Time));
scanf("%d",&T);
for(i=1;i<n;i++)
scanf("%d",&w[i]);
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d",&start);
Time[start][1][0]=true;
for(j=2;j<=n;j++)
{
start+=w[j-1];
Time[start][j][0]=true;
}
}
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d",&start);
Time[start][n][1]=true;
for(j=n-1;j>=1;j--)
{
start+=w[j];
Time[start][j][1]=true;
}
}
return;
}
void work()
{
int i,j;
f[0][1]=0;
for(i=1;i<=T;i++)
{
for(j=1;j<=n;j++)
{
f[i][j]=f[i-1][j]+1;
if(j>=2&&i-w[j-1]>=0&&Time[i-w[j-1]][j-1][0]==true)
f[i][j]=min(f[i][j],f[i-w[j-1]][j-1]);
if(j<n&&i-w[j]>=0&&Time[i-w[j]][j+1][1]==true)
f[i][j]=min(f[i][j],f[i-w[j]][j+1]);
}
}
return ;
}
int main()
{
int kase=0;
while(scanf("%d",&n)==1&&n!=0)
{
init();
work();
printf("Case Number %d: ",++kase);
if(f[T][n]<inf) printf("%d\n",f[T][n]);
else printf("impossible\n");
}
return 0;
}