标签:
2015年2月11日,我开始了我的DP之路,也不知道能不能掌握,只能一点点的积累了。这是我的第一题UVA1025 (A Spy in the Metro);
题目的意思很清楚了,当你在一个汽车站的时候,你之后两种选择,一是等着,二是上车(前提有车),当然有车的时候也可以不做,无所谓;
当然有车,也要看方向。决定状态的量是某个时刻你再某个位置。DP[i][j]即 i 时刻, 你在 j 位置 但是,DP[i][j]表示啥呢?
题目要求最短的等待时间,那么顺应题目意思DP[i][j]表示,在i时刻,j位置还需等待的时间。
状态一:等着 DP[i][j] = DP[i + 1][j] + 1; 为什么从i + 1 过来呢? 你想一下,DP表示等待的时间,那么是不是应该倒着来呢?
状态二:有往右行驶的车 DP[i][j] = min(DP[i][j], DP[i + t[j]][j];
状态三:有往左行驶的车 DP[i][j] = min(DP[i][j],DP[i + t[j - 1]][j]);
边界状态 DP[T][N] = 0;DP[T][1..N - 1] = INF;
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 int has[210][60][2]; 7 int T; 8 void work1(int t[],int time,int N) { 9 for (int i = 1;i <= N - 1;i++) { 10 if (time <= T) has[time][i][0] = 1; 11 time = time + t[i]; 12 } 13 } 14 void work2(int t[],int time,int N) { 15 for (int i = N;i > 1;i--) { 16 if (time <= T) has[time][i][1] = 1; 17 time += t[i - 1]; 18 } 19 } 20 21 int main () { 22 int N; 23 int t[80]; 24 int M1,d1; 25 int M2,d2; 26 int DP[210][60]; 27 int kase = 0; 28 //freopen("1.txt","r",stdin); 29 while (cin >> N,N) { 30 cin >> T; 31 memset(has,0,sizeof(has)); 32 for (int i = 1;i <= N - 1;i++) { 33 cin >> t[i]; 34 } 35 cin >> M1; 36 for (int i = 1;i <= M1;i++){ 37 cin >> d1; 38 work1(t,d1,N); 39 } 40 cin >> M2; 41 for (int i = 1;i <= M2;i++) { 42 cin >> d2; 43 work2(t,d2,N); 44 } 45 for (int i = 1;i <= N - 1;i++) { 46 DP[T][i] = 0x7fffff; 47 } 48 DP[T][N] = 0; 49 for (int i = T - 1;i >= 0;i--) { 50 for (int j = 1;j <= N;j++) { 51 int& ans = DP[i][j]; 52 ans = DP[i + 1][j] + 1; 53 if (has[i][j][0] && j < N && t[j] + i <= T) { 54 ans = min(ans,DP[i + t[j]][j + 1]); 55 } 56 if (has[i][j][1] && j > 1 && t[j - 1] + i <= T) { 57 ans = min(ans,DP[i + t[j - 1]][j - 1]); 58 } 59 } 60 } 61 cout << "Case Number " << ++kase << ": "; 62 if (DP[0][1] >= 0x7fffff) cout << "impossible" << endl; 63 else cout << DP[0][1] << endl; 64 } 65 }
标签:
原文地址:http://www.cnblogs.com/xiaoshanshan/p/4286723.html