求助UVA
  • 板块题目总版
  • 楼主szhqwq
  • 当前回复8
  • 已保存回复8
  • 发布时间2022/8/22 13:51
  • 上次更新2023/10/27 14:11:28
查看原帖
求助UVA
638084
szhqwq楼主2022/8/22 13:51

UVA1025 城市里的间谍 A Spy in the Metro

这是道 dpdp ,蒟蒻一直找不到错,求 dalaodalao 们指点

代码如下

#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
*/
2022/8/22 13:51
加载中...