hdu2059龟兔赛跑

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2059


思路(看别人博客。。):把起点和终点也看做充电站,假设现在在第i个充电站,那么dp[i]=min(第0个充电站加满电到第i个充电站所用时间,第1个充电站加满电到第i个充电站所用时间……第i - 1个充电站加满电到第i个充电站所用时间),然后用dp[n + 1] 和兔子所用的时间比一下就好了。


代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

#define Max 0x3f3f3f3f
int p[105];
int n,c,t;
int vr,vt1,vt2;
double dp[105];
int L;

int main()

{
    while(~scanf("%d",&L))
    {
        memset(p,0,sizeof p);
        memset(dp,0,sizeof dp);
        scanf("%d%d%d",&n,&c,&t);
        scanf("%d%d%d",&vr,&vt1,&vt2);
        for(int i = 1;i <= n;++i)
            scanf("%d",&p[i]);
        p[0] = 0;
        p[n + 1] = L;
        dp[0] = 0;
        for(int i = 1;i <= n + 1;++i)
        {
            dp[i] = Max;
            for(int j = 0;j < i;++j)
            {
                double temp;
                int len = p[i] - p[j] ;
                if(len < c)
                    temp = (double)(len) / vt1;
                else
                    temp = (double)(c) / vt1 + (double)(len - c) / vt2;
                if(j)
                    temp += t;
                dp[i] = min(dp[i],dp[j] + temp);
            }
        }
        double tuzitime = (double)(L) / vr;
        if(dp[n + 1] < tuzitime)
            printf("What a pity rabbit!\n");
        else
            printf("Good job,rabbit!\n");
    }
    return 0;
}

你可能感兴趣的:(dp,动态规划,ACM)