hdu 2059(DP)

///*

/*

	    刚开始想的太麻烦了,开两个数组记录当前最短和余量模拟过程,但感觉太烦,于是XX看网上大牛的思路,仰慕许久



	最优思路:dp[i]:记录到i的最小时间

	          从0 - (i-1) 判断确定加油后到i的时间

              可能会有疑问,如果之前到某一点 j 时还有余量(仍可加速),那 再加油 判断是不是会有问题

			  其实不会,如果到j你不加油,那肯定是之前的一点加油了,所以一直dp下来即可求出dp[n+1]

*/



#include <stdio.h>

#include <string.h>

const double MAX = 999999999.0;

double dp[105];

int main()

{

	int i,j,n;

	double L,c,t,vr,vh,vl,len;

	double temp,min;

	double a[105];

	while(scanf("%lf",&L)!=EOF)

	{

		scanf("%d %lf %lf", &n, &c, &t);

		scanf("%lf %lf %lf", &vr, &vh, &vl);

		for(i=1;i<=n;i++)

			scanf("%lf", &a[i]);

		a[0]=0.0; a[n+1]=L;

		dp[0]=0.0;

		for( i=1; i<=n+1; i++)

		{

			min = MAX;

			for( j=0; j<i; j++)

			{

				len = a[i] - a[j];

				temp = len > c ? (c/vh+(len-c)/vl) : (len/vh);

				if(j)

					temp += t;

				if(min > temp + dp[j])

					min = temp + dp[j];

			}

			dp[i]=min;

		}

		printf("%s\n", dp[n+1] < (1.0*L)/vr ? "What a pity rabbit!" : "Good job,rabbit!" );

	}

	return 0;

}

你可能感兴趣的:(HDU)