【题解】P2627 [USACO11OPEN] Mowing the Lawn G
【题解】P2627 [USACO11OPEN] Mowing the Lawn G
数据量比较大,暴力肯定是不行的。只能考虑用动态规划的方式来做。
这道题有许多dp设计的思路,这里提供两个:
方法一:普通状态设计
定义
根据定义可以得到以下状态转移方程:
如果不选择第i个元素,那么很好想直接转移即可:
如果选择第i个元素,那么在区间
通过前缀和优化一下状态,就可以得到新的状态转移方程:
可以看出只需要找到
的区间中
方法二:状态的再次压缩
在第一步的状态上加以优化,重新定义状态,令
代码很好写:
#include <iostream>
#include <algorithm>
using namespace std;
int n, k;
long long arr[100005], sum[100005];
long long b[100005], que[100005];
long long dp[100005];
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin >> n >> k;
for (int i=1; i<=n; i++) {
cin >> arr[i];
sum[i] = sum[i-1] + arr[i];
}
// dp[i]表示选到第i头奶牛的时候可以获得的最大效率。
// 枚举前面的奶牛就可以了。
int head = 0, tail = 0;
for (int i=1; i<=n; i++){
b[i] = dp[i-1] - sum[i];
while(head <= tail && que[head] < i-k) head++;
while(head <= tail && b[i] > b[que[tail]]) tail--;
que[++tail] = i;
dp[i] = b[que[head]] + sum[i];
}
cout << dp[n] << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具