UVA1025 城市里的间谍 A Spy in the Metro
这是道 dp ,蒟蒻一直找不到错,求 dalao 们指点
代码如下
#include <bits/stdc++.h>
#define int long long
#define M(a) memset(a,0,sizeof a)
using namespace std;
const int N=110;
const int INF=1e9+7;
int n,T,t[N],m1,m2,a,b;
int dp[10010][N];
bool train[N][10010][2];
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int pase=0;
while(cin>>n,n) {
M(train);
M(t);
cin>>T;
for(int i=1;i<n;i++) cin>>t[i];
cin>>m1;
for(int i=1;i<=m1;i++) {
cin>>a;
int cnt=a;
for(int k=1;k<=n;k++) {
train[cnt][k][0]=true;
cnt+=t[k];
}
}
cin>>m2;
for(int i=1;i<=m2;i++) {
cin>>b;
int cnt=b;
for(int k=n;k>=1;k--) {
train[cnt][k][1]=true;
cnt+=t[k-1];
}
}
for(int i=1;i<n;i++) dp[T][i]=INF;
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(j<n && i+t[j]<=T && train[i][j][0])
dp[i][j]=min(dp[i][j],dp[i+t[j]][j+1]);
if(j>1 && i+t[j-1]<=T && train[i][j][1])
dp[i][j]=min(dp[i][j],dp[i+t[j-1]][j-1]);
}
}
cout<<"Case Number "<<++pase<<": ";
if(dp[0][1]>=INF) cout<<"impossible"<<endl;
else cout<<dp[0][1]<<endl;
}
return 0;
}
/*
4
55
5 10 15
4
0 5 10 20
4
0 5 10 15
4
18
1 2 3
5
0 3 6 10 12
6
0 3 5 7 12 15
2
30
20
1
20
7
1 3 5 7 11 13 17
0
*/