贝茜的晨练计划(cowrun)

来源:互联网 发布:163邮箱 ssl smtp端口 编辑:程序博客网 时间:2024/04/27 06:14

题目描述

    奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运动方式是每天进行N(1 <= N <= 10,000)分钟的晨跑。在每分钟的开始,贝茜会选择下一分钟是用来跑步还是休息。
    贝茜的体力限制了她跑步的距离。更具体地,如果贝茜选择在第i分钟内跑步,她可以在这一分钟内跑D_i(1 <= D_i <= 1,000)米,并且她的疲劳度会增加1。不过,无论何时贝茜的疲劳度都不能超过M(1 <= M <= 500)。如果贝茜选择休息,那么她的疲劳度就会每分钟减少1,但她必须休息到疲劳度恢复到0为止。在疲劳度为0时休息的话,疲劳度不会再变动。晨跑开始时,贝茜的疲劳度为0。
    还有,在N分钟的锻炼结束时,贝茜的疲劳度也必须恢复到0,否则她将没有足够的精力来对付这一整天中剩下的事情。
    请你计算一下,贝茜最多能跑多少米。








(题解)

这是一题比较典型的动态规划类题目,搜索(search)会超时,所以只能用动态规划做。所以由此我们可以想到,用F[i,j]表示走到第i分钟时疲劳值为j走的最远距离。这段状态转移方程分为两段,一段是贝茜休息时的,一段是贝茜走路时的。休息时的:F[i,j]:=max(F[i,0]{贝茜在i时间段刚好休息完(疲劳值为0)},F[i-j,j]{贝茜从 i-j 时间段开始休息,当时的疲劳值为j }); F[i,0]:=F[i,j];

走路时的:F[i,j]:=max(F[i-1,j-1]{表示它从上一个时刻走到这一个时间前的值},F[i,j]{表示它本身});

下面是代码:

 

for i:=1 to n do        begin                f[i,0]:=f[i-1,0];                for j:=1 to m do                begin                        if i-j>=0 then                        begin                                f[i,j]:=max(f[i,0],f[i-j,j]);                                f[i,0]:=f[i,j];                        end;                        f[i,j]:=max(f[i-1,j-1]+a[i],f[i,j]);                end;        end;        writeln(f[n,0]);







2 0
原创粉丝点击