贝茜的晨练计划(cowrun)

    xiaoxiao2025-10-25  9

    题目描述

        奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运动方式是每天进行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]);

    转载请注明原文地址: https://ju.6miu.com/read-1303502.html
    最新回复(0)