• P1353 Running S


    题意:https://www.luogu.com.cn/problem/P1353

    奶牛们打算通过锻炼来培养自己的运动细胞,作为其中的一员,贝茜选择的运动方式是每天进行 n 分钟的晨跑。在每分钟的开始,贝茜会选择下一分钟是用来跑步还是休息。

    贝茜的体力限制了她跑步的距离。更具体地,如果贝茜选择在第 ii 分钟内跑步,她可以在这一分钟内跑 di 米,并且她的疲劳度会增加 1。不过,无论何时贝茜的疲劳度都不能超过 m。

    如果贝茜选择休息,那么她的疲劳度就会每分钟减少 1,但她必须休息到疲劳度恢复到 0 为止。在疲劳度为 0 时休息的话,疲劳度不会再变动。晨跑开始时,贝茜的疲劳度为 0

    还有,在 n 分钟的锻炼结束时,贝茜的疲劳度也必须恢复到 0,否则她将没有足够的精力来对付这一整天中剩下的事情。

    请你计算一下,贝茜最多能跑多少米


    看上去不难的一道题目,wa了很久。

    明显定义dp [ i ] [ j ] 为第i分钟疲劳值为j的状态最多跑几米

    如果j大于1,那么可能是前一秒疲劳值为j-1,这一秒在跑步造成的。

    如果j等于0,那么可能是直接继承的上一秒疲劳值为0,也可能是上一秒疲劳值为1休息而来

    #include <bits/stdc++.h>
    using namespace std;
    int n,m;
    int a[10009];
    int dp[10090][509];
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)    cin>>a[i];
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<=min(i,m);j++)
            {
                if(j==0)    dp[i][j]=max(dp[i][j],dp[i-1][j]);
                else dp[i][0]=max(dp[i][0],dp[i-j][j]);//j不为0,那么可以考虑休息 
                if(j>=1)    dp[i][j]=max(dp[i][j],dp[i-1][j-1]+a[i]);
            }
        }
        cout<<dp[n][0];
    }

     

  • 相关阅读:
    wordpress调用函数大全
    Dedecms 数据库结构分析
    屏幕广播的实现(二)
    屏幕广播的实现(一)
    Alt+Ctrl+Del组合键的屏蔽
    关于钩子(HOOK)
    C# 线程入门 00
    C# 中 关键字 return break continue 详解
    Windows 网络命令
    vue自定义指令封装(加深印象)
  • 原文地址:https://www.cnblogs.com/iss-ue/p/12511522.html
Copyright © 2020-2023  润新知