传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2059
#include<stdio.h>
#define max 1000000
main()
{
double DP[200],L,C,T,v,v1,v2,a[200],t,l;
int N,i,j;
while(scanf("%lf",&L)!=EOF)
{
scanf("%d %lf %lf",&N,&C,&T);
scanf("%lf %lf %lf",&v,&v1,&v2);
a[0]=0;a[N+1]=L;
for(i=1;i<=N;i++)
{
scanf("%lf",&a[i]);
}
for(i=0;i<200;i++)
{
DP[i]=max;
}
DP[0]=0;
for(i=1;i<=N+1;i++)
{
for(j=0;j<=i-1;j++)
{
t=0;
l=a[i]-a[j];
if(C>=l) t+=(a[i]-a[j])/v1;
else t+=((a[i]-a[j])-C)/v2+C/v1;
if(j!=0) t+=T;
DP[i]=DP[i]>DP[j]+t? DP[j]+t:DP[i];
}
}
if(DP[N+1]<L/v) printf("What a pity rabbit!\n");
else printf("Good job,rabbit!\n");
}
}
思路:
已知到点0,1...i-1的最短时间,求到点i的最短时间,只需遍历点0到点i-1,求出在该点加油后直接行驶到点i所用的时间。(这包含了所有情况,弄懂这一点就迎刃而解了)选择最小即可。(每个点的最短时间独立,即到点i的最短时间所用方案与到点j所用的最短时间方案是可以不一样的。但它一定是到该点的最短时间)