码迷,mamicode.com
首页 > 其他好文 > 详细

UVA 1025

时间:2015-02-11 20:17:34      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:

 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 }

 

UVA 1025

标签:

原文地址:http://www.cnblogs.com/xiaoshanshan/p/4286723.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!