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

 

 

 

你可能感兴趣的:(HDU)