【题解】P2627 [USACO11OPEN] Mowing the Lawn G
【题解】P2627 [USACO11OPEN] Mowing the Lawn G
数据量比较大,暴力肯定是不行的。只能考虑用动态规划的方式来做。
这道题有许多dp设计的思路,这里提供两个:
方法一:普通状态设计
定义\(dp[i][1/0]\)表示截止遍历到第\(i\)个元素时,选择第\(i\)个元素或不选第\(i\)个元素可以分别可以获得到的最大工作效率。
根据定义可以得到以下状态转移方程:
如果不选择第i个元素,那么很好想直接转移即可:\(dp[i][0] = max(dp[i-1][0], dp[i-1][1]\)。
如果选择第i个元素,那么在区间\([i-K+1, i]\)内必须有一个奶牛不能工作,可以列出方程:\(dp[i][1] = max(dp[j][0], \sum\limits_{j=i-K+1}^{i}E_j\)。
通过前缀和优化一下状态,就可以得到新的状态转移方程:\(dp[i][1] = max(dp[j][0] + sum[i] - sum[j])\)。因为求最大值,而且i是不会变的,因此可以直接将\(sum[i]\)提前,可得\(dp[i][1] = max(dp[j][0] - sum[j]) + sum[i], (i-K <= j < i)\)。
可以看出只需要找到\(dp[j][0] - sum[j]\)的最大值就可以了。因此我们只需要用一个单调数组维护一个长度为\(K\)
的区间中\(dp[j][0] - sum[j]\)的最大值即可。
方法二:状态的再次压缩
在第一步的状态上加以优化,重新定义状态,令\(dp[i]\)表示为遍历到第\(i\)头奶牛后可以获得的最大效率。相同地,根据状态的定义可以得到状态转移方程\(dp[i] = max(dp[j-1] - sum[j]) + sum[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;
}
【题解】P2627 [USACO11OPEN] Mowing the Lawn G的更多相关文章
- P2034 选择数字 / P2627 [USACO11OPEN]Mowing the Lawn G
Link 题目描述 给定一行 \(n\) 个非负整数 \(a[1]..a[n]\) .现在你可以选择其中若干个数,但不能有超过 \(k\) 个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入 ...
- 洛谷P2627 [USACO11OPEN]Mowing the Lawn G (单调队列优化DP)
一道单调队列优化DP的入门题. f[i]表示到第i头牛时获得的最大效率. 状态转移方程:f[i]=max(f[j-1]-sum[j])+sum[i] ,i-k<=j<=i.j的意义表示断点 ...
- Mowing the Lawn【线性dp + 单调队列优化】
题目链接:https://ac.nowcoder.com/acm/contest/2652/G 题目大意:与上一篇博客 烽火传递 差不多. 1.一共n头羊,若超过m头连续的羊在一起,就会集体罢工,每头 ...
- [题解] Atcoder Beginner Contest ABC 270 G Ex 题解
点我看题 G - Sequence in mod P 稍微观察一下就会发现,进行x次操作后的结果是\(A^xS+(1+\cdots +A^{x-1})B\).如果没有右边那一坨关于B的东西,那我们要求 ...
- 题解 P6098 【[USACO19FEB]Cow Land G】
震惊,蒟蒻学树剖第二天就打题解 所以说,理解之后树剖这种东西其实难度真心不大.至少这种模板题都可以秒切的 这里推荐一个博客: 树剖详解 蒟蒻就是在这个博客上学到的 如果想看我自己写的总结,请点 我的博 ...
- 树链剖分详解&题解 P6098 【[USACO19FEB]Cow Land G】
看到各位大佬们已经把其他的东西讲的很明白了,我这个 juruo 就讲一讲最基本的树链剖分吧. 0.树剖是什么?能吃吗? 不能吃 树剖是树链剖分的简称,我们一般说的树剖其实指重链剖分.当然,还有一种长链 ...
- 「题解」USACO15FEB Fencing the Herd G
本文将同步发布于: 洛谷博客: csdn: 博客园: 简书: 题目 题目链接:洛谷 P3122.USACO 官网. 题意概述 给你平面上的一些点和直线,有两种操作: 新加入一个点 \((x,y)\): ...
- 题解 洛谷 P2287 [USACO07NOV]Sunscreen G
原题 传送门 有C个奶牛去晒太阳 (1 <=C <= 2500),每个奶牛各自能够忍受的阳光强度有一个最小值和一个最大值(minSPFi and maxSPFi),太大就晒伤了,太小奶牛没 ...
- DP+单调队列详解+题目
介绍: 单调队列优化的原理 先回顾单调队列的概念,它有以下特征: (1)单调队列的实现.用双端队列实现,队头和队尾都能插入和弹出.手写双端队列很简单. (2)单调队列的单调性.队列内的元素 ...
- The 2013 South America/Brazil Regional Contest 题解
A: UVALive 6525 cid=61196#problem/A" style="color:blue; text-decoration:none">Atta ...
随机推荐
- Java List集合去重、过滤、分组、获取数据、求最值、合并、排序、跳数据和遍历
前言 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i. 准备工作:现有一个User类.Student 类和Ticket类,加入相关依赖 @Data public class User { / ...
- Java多线程之Callable和Future
Java多线程之Callable和Future 本篇说明的是Callable和Future,它俩很有意思的,一个产生结果,一个拿到结果. Callable接口类似于Runnable,从名字就可以看出来 ...
- windows server 出现.net 3.5安装不上去
前言 有人说为什么到了现在还有人用.net 3.5呢?其实我也不用,主要是mmsql安装的时候要用到. 正文 一般我们不同电脑在程序和功能中添加,如果添加不上会弹出一个自动获取的一个过程,这时我们点击 ...
- c# 历史版本特性
版本 .NET Framework版本 Visual Studio版本 发布日期 特性 C# 1.0 .NET Framework 1.0 Visual Studio .NET 2002 2002.1 ...
- 安装 php_mongodb.dll的坑
背景 php_mongodb.dll在这里介绍的是for php,php_mongodb.dll是这个坑,因为php_mongodb.dll前生是php_mongo.dll,而这个东西,它又不更新了, ...
- WPF随笔收录-RestSharp下载文件406问题
一.前言 在项目开发过程中,涉及到通过http下载文件的需求,最近遇到一个406问题,由于第一次接触这个问题,也被问题卡了好久,在网上风暴了很久才找到解决办法: 二.解决方法 解决的办法就是在requ ...
- 13_总结Vue数据监测
总结: Vue监视数据的原理: 1.vue会监视data中所有层次的数据 2.如何监视对象中的数据? 通过setter实现监视,且要在new V ...
- 迁移 Nacos 和 ZooKeeper,有了新工具
简介: 注册中心迁移在行业中主要有两个方案,一个是双注册双订阅模式(类似数据库双写),一个是 Sync 模式(类似于数据库 DTS):MSE 同时支持了两种模式,对于开通 MSE 服务治理客户,MSE ...
- Java 定时任务技术趋势
简介:定时任务是每个业务常见的需求,比如每分钟扫描超时支付的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报表等等. 作者:黄晓萌(学仁) Java 中自带的解决方案 使用 Time ...
- WPF 使用 Dispatcher 的 InvokeAsync 和 BeginInvoke 的异常处理差别
一般认为 WPF 的 Dispatcher 的 InvokeAsync 方法是 BeginInvoke 方法的平替方法和升级版,接近在任何情况下都应该在业务层使用 InvokeAsync 方法代替 B ...