您的位置:首页 > 编程语言 > Go语言

HDOJ2059简化记录条件找出问题本质DP

2015-06-03 16:03 302 查看
<pre name="code" class="cpp">//龟兔赛跑问题提取信息:加油站位置,当前加油站处的油量,到达此地的最短时间
//到达每一个事件点的时候查看上一个事件点充或者没充电到达该点的最短时间但是电量记录就会
//会繁琐,那么有什么办法可以避免这个问题呢
//后来发现其实根本不用管还剩下多少电量,只用看最后一次加油的位置是哪就行了
//46MS 1620K
#include <iostream>
using namespace std;

#define  MAX_N 110
static double L;
static int N;
static double C,T;
static double VR,VR1,VR2;

static double stop[MAX_N];//加油站
static double dp[MAX_N];
static double t1;
static void DP()
{
for (int i=0;i<=N+1;++i)
dp[i] = 0x3f3f3f3f;
dp[0] = 0;//开始处不用加油
if (stop[1]>=C)
dp[1] = C/VR1 + (stop[1]-C)/VR2;
else
dp[1] = stop[1]/VR1;

for (int i=2;i<=N+1;++i)
{
//寻找上一次加油的地点
for (int j=i-1;j>=0;j--)//最后一次加油的地方
{
double len = stop[i] - stop[j];
double tn = 0;
if (len>=C)
tn = C/VR1 + (len-C)/VR2 + T;
else
tn = len/VR1 + T;

if (j==0)
dp[i] = min(dp[i],dp[j]+tn-T);
else
dp[i] = min(dp[i],dp[j]+tn);
}
}
if (dp[N+1]<t1)
printf("What a pity rabbit!\n");
else
printf("Good job,rabbit!\n");
}

int main()
{
while(~scanf("%lf",&L))
{
scanf("%d %lf %lf",&N,&C,&T);
scanf("%lf %lf %lf",&VR,&VR1,&VR2);
t1 = L/VR;
for (int i=1;i<=N;++i)
{
scanf("%lf",&stop[i]);
}
stop[N+1] = L;
DP();
}

return 0;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj dp dfs algorithm c