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 }
代码君

 

 

 

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/3831364.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值