1 条题解

  • 0
    @ 2026-2-6 16:14:40
    #include<bits/stdc++.h>
    using namespace std;
    
    // [1] 全局变量:n为总天数,f为最大允许疲劳度;arr存储每天的摆摊收益
    int n,f; 
    int arr[10100];
    
    int main(){
        // [2] 主函数:处理输入、动态规划计算最大收益并输出结果
        cin>>n>>f;  // [3] 读取输入的总天数n和最大疲劳度f
        
        // [4] 前缀和数组sum:sum[i]表示前i天的收益总和,用于快速计算区间收益
        vector<int> sum(n+1, 0);
        for(int i=1;i<=n;i++){
            cin>>arr[i];
            sum[i] = sum[i-1] + arr[i];  // [5] 递推计算前缀和
        }
        
        // [6] dp数组:dp[i]表示第i天结束时(疲劳度为0)的最大收益
        vector<int> dp(n+1, 0);
        
        // [7] 遍历每一天,动态规划更新最大收益
        for(int i=1;i<=n;i++)
        {
            // [8] 第i天选择不摆摊时,收益与前一天保持一致
            dp[i] = max(dp[i], dp[i-1]);
            
            // [9] 枚举摆摊j天的情况(对应疲劳度j,需休息j天恢复,总时长2j天)
            for(int j=1;j<=f;j++)
            {
                // [10] 若当前天数不足j天摆摊+j天休息的总时长,终止当前枚举
                if(i < 2*j) break;
                
                // [11] 计算“连续j天摆摊+连续j天休息”的收益:
                // 摆摊收益为区间[i-2j, i-j]的和,加上前i-2j天的最大收益
                int ans = (sum[i-j] - sum[i-2*j]) + dp[i-2*j];
                
                // [12] 更新第i天的最大收益
                dp[i] = max(dp[i], ans);
            }
        }
        
        // [13] 输出第n天的最大收益(此时疲劳度已恢复为0,满足题目要求)
        cout<<dp[n];
        return 0;
    }
    
    • 1

    信息

    ID
    1329
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者