HDU 2056 龟兔赛跑 (DP)

题意:见题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2059

解题报告:以前一直没看出来这题是个DP题,知道是DP题就简单了 。首先要把起点和终点看成是两个充电站,然后假设有两个点i 和 j,判断的就 是假设如果从

i 充电站充电一次,直到j点,判断这样到j点一共用的时间,取小的,核心的一句代码就是:

dp[j] = min(dp[j],dp[i] + judge(i,j) + T);

judge(i,j)这个函数用来你判断 当 在  i 点充电后直到 j 点,这一段路所需要的时间是,然后dp[i] 是冲起点到 i 点所花费的时间,然后T表示在i点充电所

花费的时间。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 double que[105],T[105];
 8 int n;
 9 double l,c,t,vr,vt[2];
10 
11 double judge(int i,int j)
12 {
13     if(que[j] - que[i] > c)
14     return (c / vt[0] + (que[j] - que[i] - c) / vt[1]);
15     else return (que[j] - que[i]) / vt[0];
16 }
17 
18 int main()
19 {
20     while(scanf("%lf",&l)!=EOF)
21     {
22         scanf("%d%lf%lf",&n,&c,&t);
23         scanf("%lf%lf%lf",&vr,&vt[0],&vt[1]);
24         for(int i = 1;i <= n;++i)
25         scanf("%lf",&que[i]);
26         que[0] = T[0] = 0;
27         n++;
28         que[n] = l;
29         for(int i = 0;i <= n;++i)
30         if(que[i] <= c)
31         T[i] = que[i] / vt[0];
32         else T[i] = c / vt[0] + (que[i] - c) / vt[1];
33         for(int i = 1;i < n;++i)
34         for(int j = n;j > i;--j)
35         T[j] = min(T[j],T[i] + judge(i,j) + t);
36         double t_vr = l / vr;
37         printf(T[n] < t_vr? "What a pity rabbit!\n":"Good job,rabbit!\n");
38     }
39     return 0;
40 }
View Code

 

posted @ 2014-01-26 17:48  xiaxiaosheng  阅读(278)  评论(0编辑  收藏  举报