对于DP,还不是很熟。需要加强!!~~
说一下这道题,由于兔子是匀速的,所以兔子到达终点的时间是确定的,唯一不确定的是乌龟的。
将起点,终点,以及中间的N个充电站当作N + 2 个点。需要求解到达N + 2个点的最优解。
起点时间是0.这是必须的,然后往后面DP
到第i个,就让j从0循环到i-1,依次代表从j站充满了电一直开到i站,这样得到到达i站所需要的最短时间。
最后比较到达第n+2站(终点)的时间与兔子所花的时间就可以了。
下面的是AC的代码:
#include <iostream>
#include <cstring>
using namespace std;
int L, N, C, T;
int VR, VT1, VT2;
int p[102];
double dp[105];
void DP()
{
double min, ans;
memset(dp, -1, sizeof(dp));
dp[0] = 0;
for(int i = 1; i < N + 2; i++)
{
min = 10000000000;
for(int j = 0; j < i; j++)
{
int len = p[i] - p[j]; //判断两个点之间的距离
if(len > C) //距离大于电动车的最大距离,一段距离需要脚踩
{
ans = 1.0 * C / VT1 + (len - C + 0.0) / VT2;
}
else //全程骑车。
{
ans = 1.0 * len / VT1;
}
ans += dp[j]; //加上前面的时间
if(j) //过充电站,加上充电时间
ans += T;
if(min > ans) //找最小时间
min = ans;
}
dp[i] = min;
}
}
int main()
{
while(scanf("%d", &L) != EOF) //输入
{
scanf("%d%d%d", &N, &C, &T);
scanf("%d%d%d", &VR, &VT1, &VT2);
for(int i = 1; i <= N; i++)
scanf("%d", &p[i]);
p[0] = 0; p[N + 1] = L; //起点距离为0,终点距离为 L
DP();
if(1.0 * L / VR < dp[N + 1]) //判断时间与兔子的时间的大小
printf("Good job,rabbit!\n");
else
printf("What a pity rabbit!\n");
}
return 0;
}