题意:见题目链接: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 }