HDU 2059 龟兔赛跑

受上一道题影响,我本来想着开一个二维数组来表示充电和不充电的状态。

可这样就有一个问题,如果没有充电,那么在下一个阶段就有剩余的电量。

这样问题貌似就不可解了,难道是因为不满足动态规划的无后效性这一条件?

这里先打个问号。

 

所以这题还是看的别人的思路。

将起点和终点划分到N个加电站中去

这样一共有N+2点,用DP[i]表示到第i个加电站的最小耗费时间

那么在求DP[i]的时候,DP[0]...DP[i-1]已经求得

让j从0遍历到i-1,每一个j表示最后一次充电到i点

那么状态转移方程为

DP[i] = min(DP[j] + t(j, i)) //t(j, i)表示从j充完电一直到i点(中途没有充过电)

 

 

 1 //#define LOCAL
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 double p[150];
 8 double dp[150];
 9 
10 int main(void)
11 {
12     #ifdef LOCAL
13         freopen("2059in.txt", "r", stdin);
14     #endif
15     int l;
16     while(scanf("%d", &l) != EOF)
17     {
18         int i, j;
19         int n, c, t;
20         double vr, vt1, vt2;
21         double temp;
22         memset(dp, 0, sizeof(dp));
23         memset(p, 0, sizeof(p));
24         
25         scanf("%d%d%d", &n, &c, &t);
26         scanf("%lf%lf%lf", &vr, &vt1, &vt2);
27         for(i = 1; i <= n; ++i)
28         {
29             scanf("%lf", &p[i]);
30         }
31         p[0] = 0;
32         p[n + 1] = l;
33         dp[0] = 0;
34 
35         for(i = 1; i <= n + 1; ++i)
36         {
37             dp[i] = 10000000;
38             for(j = 0; j < i; ++j)
39             {
40                 double lenth = p[i] - p[j];
41                 if(c >= lenth)
42                     temp = dp[j] + lenth / vt1;
43                 else
44                     temp = dp[j] + c / vt1 + (lenth - c) / vt2;
45                 if(j > 0)
46                     temp += t;
47                 if(temp < dp[i])
48                     dp[i] = temp;
49             }
50         }
51 
52         if(dp[n + 1] < (l / vr))
53             printf("What a pity rabbit!\n");
54         else
55             printf("Good job,rabbit!\n");
56     }
57     return 0;
58 }
代码君

 

 

 

posted @ 2014-07-08 13:53  AOQNRMGYXLMV  阅读(327)  评论(0编辑  收藏  举报