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 }