难受啊,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;
}