1 条题解
-
0
#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
- 上传者