这是自己第一次独立做dp题,弄了一下午,颇有感触。。
1.一定要想清楚dp[i]的含义,它代表我们要去的最优结果。
2.转移方程要精准,注意把起点也想象成一站,则1--n+1站必然由有一充电站过来的,所以不用考虑每站充电不充电!!
#include <stdio.h>
#define MAXN 105
#define INF 0xfffffff
double dp[MAXN];
int main()
{
int L;
int N,C,T;/*充电站的个数,电动车冲满电行驶的距离,充电所需要的时间*/
double vr,vt1,vt2;/*兔子跑步的速度,乌龟开电动车的速度,乌龟脚蹬电动车的速度*/
int p[MAXN] = {0};
int i,j,s;
double min;
double t;
int len;
while(~scanf("%d",&L))
{
scanf("%d%d%d",&N,&C,&T);
scanf("%lf%lf%lf",&vr,&vt1,&vt2);
for(i = 1; i <= N; i++)
scanf("%d",&p[i]);
s = 0;
dp[0] = 0;
p[0] = 0;
p[N+1] = L;
for(i = 1; i <= N+1; i++)
{
min = INF;
for(j = 0; j <= i-1; j++)
{
/*把起点也想象成一站,则1--n+1站必然由有一充电站过来的*/
len = p[i] - p [j];
if(C > len)
t = len / vt1 ;
else
t = C / vt1 + (len - C) / vt2;
if(j != 0)
t += T;
t += dp[j]; /*总时间!!!*/
if(min > t)
min = t ;
}
dp[i] = min;
}
if(dp[N+1] > (L / vr))
printf("Good job,rabbit!/n");
else
printf("What a pity rabbit!/n");
/* for(i = 0; i < N+2; i++)
printf("%.2lf ",dp[i]);
*/}
return 0;
}