题意 请参考紫书描述~
思路 状态开始没有定好,还是参考了下紫书..
dp[i][j] 表示在第i秒,第j个站上,一共的最少等待时间
初始条件dp[T][n] = 0,其它赋值为inf
转移:(1)在该站等一分钟
(2)若有向左走的车,则可以乘上
(3)若有向右走的车,则可以乘上
更新顺序:时间i倒着遍历
注意:数组要多开...
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn = 150;
const int maxm = 350;
const int inf = 0x3f3f3f3f;
int dp[maxm][maxn];
int t,n,m1,m2;
int ti[maxn];
int d[maxn],e[maxn];
int hash1[maxm][maxn][2];
int main()
{
int i,j;
int T = 1;
while(scanf("%d",&n)==1 && n!=0)
{
scanf("%d",&t);
for(i=1;i<=n-1;i++)
{
scanf("%d",&ti[i]);
}
ti[n] = 0;
scanf("%d",&m1);
for(i=0;i<m1;i++)
{
scanf("%d",&d[i]);
}
scanf("%d",&m2);
for(i=0;i<m2;i++)
{
scanf("%d",&e[i]);
}
memset(dp,0x3f,sizeof(dp));
memset(hash1,0,sizeof(hash1));
for(i=0;i<m1;i++)
{
int add = 0;
for(j=0;j<n;j++)
{
add += ti[j];
hash1[d[i]+add][j][0] = 1;
}
}
for(i=0;i<m2;i++)
{
int add = 0;
for(j=n-1;j>=0;j--)
{
add += ti[j+1];
hash1[e[i]+add][j][1] = 1;
}
}
dp[t][n-1] = 0;
for(i=t-1;i>=0;i--)
{
for(j=0;j<n;j++)
{
if(dp[i+1][j] != inf)
dp[i][j] = dp[i+1][j] + 1;
if(hash1[i][j][0]==1 && j<n-1 && i+ti[j+1]<=t)
{
dp[i][j] = min(dp[i][j],dp[i+ti[j+1]][j+1]);
}
if(hash1[i][j][1]==1 && j>0 && i+ti[j]<=t)
{
dp[i][j] = min(dp[i][j],dp[i+ti[j]][j-1]);
}
}
}
if(dp[0][0] == inf)
cout<<"Case Number "<<T<<": "<<"impossible\n";
else
cout<<"Case Number "<<T<<": "<<dp[0][0]<<"\n";
T++;
}
return 0;
}