Problem UVA1025-A Spy in the Metro
Accept: 713 Submit: 6160
Time Limit: 3000 mSec
Problem Description
Input
Output
For each test case, print a line containing the case number (starting with 1) and an integer representing the total waiting time in the stations for a best schedule, or the word ‘impossible’ in case Maria is unable to make the appointment. Use the format of the sample output.
Sample Input
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
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
Sample Output
Case Number 1: 5
Case Number 2: 0
Case Number 3: impossible
题解:很明显的动态规划,dp[i][j]表示i时刻在j站点还需要的最短等待时间,总共就三种选择,状态转移方程很简单,边界一直是我写动态规划题比较头疼的地方,不过这个题还比较简单,t时刻在n站点自然是0,在其他站点就是INF(为了不会从这些状态转移过去)。
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 const int maxt = 200 + 10, maxn = 50 + 5; 6 const int INF = 0x3f3f3f3f; 7 8 int read() { 9 int q = 0; char ch = ' '; 10 while (ch<'0' || ch>'9') ch = getchar(); 11 while ('0' <= ch && ch <= '9') { 12 q = q * 10 + ch - '0'; 13 ch = getchar(); 14 } 15 return q; 16 } 17 18 int n, t, m1, m2; 19 int ti[maxn]; 20 int dp[maxt][maxn]; 21 bool have_train[maxt][maxn][2]; 22 23 void init() { 24 memset(have_train, false, sizeof(have_train)); 25 for (int i = 1; i <= n - 1; i++) { 26 dp[t][i] = INF; 27 } 28 dp[t][n] = 0; 29 } 30 31 int T = 1; 32 33 int main() 34 { 35 //freopen("input.txt", "r", stdin); 36 while (scanf("%d", &n) && n) { 37 t = read(); 38 init(); 39 for (int i = 1; i < n; i++) { 40 ti[i] = read(); 41 } 42 ti[n] = ti[0] = INF; 43 m1 = read(); 44 int d; 45 for (int i = 0; i < m1; i++) { 46 d = read(); 47 int cnt = 1; 48 for (int j = 1; j <= n; j++) { 49 have_train[d][cnt][0] = true; 50 //printf("d:%d cnt:%d ", d, cnt); 51 cnt++; 52 d += ti[j]; 53 } 54 } 55 //printf(" "); 56 57 m2 = read(); 58 for (int i = 0; i < m2; i++) { 59 d = read(); 60 int cnt = n; 61 for (int j = n; j >= 1; j--) { 62 have_train[d][cnt][1] = true; 63 //printf("d:%d cnt:%d ", d, cnt); 64 cnt--; 65 d += ti[j - 1]; 66 } 67 } 68 69 for (int i = t - 1; i >= 0; i--) { 70 for (int j = 1; j <= n; j++) { 71 dp[i][j] = dp[i + 1][j] + 1; 72 if (i + ti[j] <= t && have_train[i][j][0]) { 73 dp[i][j] = min(dp[i][j], dp[i + ti[j]][j + 1]); 74 } 75 76 if (i + ti[j - 1] <= t && have_train[i][j][1]) { 77 dp[i][j] = min(dp[i][j], dp[i + ti[j - 1]][j - 1]); 78 } 79 } 80 } 81 82 printf("Case Number %d: ", T++); 83 if (dp[0][1] >= INF) { 84 printf("impossible "); 85 } 86 else { 87 printf("%d ", dp[0][1]); 88 } 89 } 90 return 0; 91 }