杭电2059 DP

传送门: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所用的最短时间方案是可以不一样的。但它一定是到该点的最短时间)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值