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; }