状态转移方程为 dp[i]=min(dp[j]+time, Min) for j in range(0,i);表明最短时间是在某个充电站充完电后一口气冲到i的,内层j循环尝试寻找这样的j,外部i循环不断生成到充电站i的最短时间。
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int L;
while(cin >> L)
{
int N,C,T,VR,V1,V2,p[110]={0};
cin >> N >> C >> T;
cin >> VR >> V1 >> V2;
for(int i = 1; i <= N; i++) cin >> p[i];
p[N+1] = L;
double TR = 1.0 * L / VR,dp[110];
dp[0] = 0;//dp[i]表示到第i个充电站所需最短时间.
for(int i = 1; i <= N + 1; i++)
{
double Min = 233333333;
for(int j = 0; j < i; j++)//第j个充电站一口气过去,中途不充电。
{
int dis = p[i] - p[j];//距离
double time;//j到i耗时,dp[j]+time表明路上总耗时。显然0到i的最小值在这里面产生。
if (C >= dis) time = 1.0 * dis / V1;
else time = C * 1.0 / V1 + (dis - C) * 1.0 / V2;
if(j) time += T;//这里原先不是太理解。后来想了想,最短时间应该是在某个充电站充电后一口气冲过去的才有的,这里加上了在那个充电站充电的时间。
Min = min(Min,dp[j]+time);//
}
dp[i] = Min;
}
if(dp[N+1] > TR) cout << "Good job,rabbit!\n";
else cout << "What a pity rabbit!\n";
}
return 0;
}