hdu 2059 DP

来源:互联网 发布:微信广告植入源码 php 编辑:程序博客网 时间:2024/06/05 02:06

dp[i][0] 表示第i站不充电,dp[i][1]表示第i站充电

状态转移方程:

dp[i][0] = MIN(dp[j][1]+在j充满电后跑到i的时间,     dp[j][0]+在j没有充电跑到i的时间)       i-1>=j>=0

dp[i][1] = dp[i][0] + 充电需要的时间


#include "stdio.h"#define MIN(a, b) ((a)<(b)?(a):(b))void main(){int l;int n, c, t;int vr, vt1, vt2;int cha[110];int i, j, dist;double dp[110][2], rabbit, tmp;  //dp[i][0] 在第i个站不充电 dp[i][1] 在第i个站充电freopen("in.txt", "r", stdin);while(scanf("%d", &l)!=EOF){scanf("%d %d %d", &n, &c, &t);scanf("%d %d %d", &vr, &vt1, &vt2);for(i=1; i<=n; i++)scanf("%d", cha+i);cha[0] = 0; //起点cha[i++] = l; //把终点加上,这样就有了n+1个rabbit = l*1.0/vr;  //兔子跑完所需时间dp[0][0] = dp[0][1] = 0;for(i=1; i<=n+1; i++){  //这里是到n+1,因为加上了终点dp[i][0] = rabbit;for(j=i-1; j>=0; j--){  //上次在第j个站充的电dist = cha[i]-cha[j];tmp = MIN((dp[j][1] + (dist>c ? ((dist-c)*1.0/vt2 + c*1.0/vt1) : (dist*1.0/vt1))), (dp[j][0]+ dist*1.0/vt2));dp[i][0] = MIN(dp[i][0], tmp);}if(dp[i][0]>=rabbit) break;dp[i][1] = dp[i][0] + t;}if(i<=n+1 || dp[n+1][0]>rabbit) printf("Good job,rabbit!\n");elseprintf("What a pity rabbit!\n");}}