题目链接:
https://vjudge.net/problem/UVA-1025
题意:
题解:
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define MS(a) memset(a,0,sizeof(a)) 5 #define MP make_pair 6 #define PB push_back 7 const int INF = 0x3f3f3f3f; 8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL; 9 inline ll read(){ 10 ll x=0,f=1;char ch=getchar(); 11 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 12 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 13 return x*f; 14 } 15 ////////////////////////////////////////////////////////////////////////// 16 const int maxn = 12500+10; 17 18 int n,T; 19 int t[55],M1,d1[55],M2,d2[55]; 20 int has_train[maxn][55][2]; 21 int dp[maxn][55]; 22 23 int main(){ 24 int cas = 1; 25 while(cin >> n && n) { 26 cin >> T; 27 for(int i=1; i<n; i++) 28 cin >> t[i]; 29 cin >> M1; 30 for(int i=1; i<=M1; i++) 31 cin >> d1[i]; 32 cin >> M2; 33 for(int i=1; i<=M2; i++) 34 cin >> d2[i]; 35 MS(has_train); 36 for(int i=1; i<=M1; i++){ 37 int k = d1[i]; 38 for(int j=1; j<n; j++){ 39 has_train[k][j][0] = 1; 40 k += t[j]; 41 } 42 has_train[k][n][0] = 1; 43 } 44 for(int i=1; i<=M2; i++){ 45 int k = d2[i]; 46 has_train[k][n][1] = 1; 47 for(int j=n-1; j>=1; j--){ 48 k += t[j]; 49 has_train[k][j][1] = 1; 50 } 51 } 52 53 for(int j=0; j<=n; j++) dp[T][j] = INF; 54 dp[T][n] = 0; 55 56 for(int i=T-1; i>=0; i--){ 57 for(int j=n; j>=1; j--){ 58 dp[i][j] = dp[i+1][j] + 1; 59 if(j<n && has_train[i][j][0] && i+t[j]<=T) 60 dp[i][j] = min(dp[i][j],dp[i+t[j]][j+1]); 61 if(j>1 && has_train[i][j][1] && i+t[j-1]<=T) 62 dp[i][j] = min(dp[i][j],dp[i+t[j-1]][j-1]); 63 } 64 } 65 66 if(dp[0][1] >= INF) printf("Case Number %d: impossible ",cas++); 67 else printf("Case Number %d: %d ",cas++,dp[0][1]); 68 } 69 70 71 return 0; 72 }