[洛谷P2627] 修剪草坪
传送门:>Here<
题意:不能有连续超过$k$个奶牛的一段,求最大的和
思路分析
Dp还是容易看出来的。
我的第一感觉是一维,$f[i]$表示前i头奶牛的最大效率。其实这也是可以解的,具体方法将会在后文介绍。
考虑二维的解法,$f[i][0]$表示奶牛i不参与时的最大效率,$f[i][1]$表示奶牛i参与。我们知道,在前$k$头奶牛中必定有一头奶牛不参与——对于$f[i][0]$转移很简单,由于奶牛$i$不参与,一定是选择继承,所以必定有$$f[i][0] = Max(f[i-1][0], f[i-1][1])$$. 而$f[i][1]$可以利用$f[i-j][0]$(0<j<K)来转移:$$f[i][1] = Max(f[i-j][0] + sum[i] - sum[i-j])$$
这个方程的意思就是$i-j$这头奶牛不选,并继承最优子结构$f[i-j][0]$,然后$i-j$之后的奶牛全部选择,于是用一个前缀和来维护即可。整理方程发现,$sum[i]$是确定的,于是可以将它提出$Max$之外,得到$$f[i][1] = Max(f[i-j][0] - sum[i-j]) + sum[i]$$我们发现这个方程就只与i-j有关了,并且是个定长区间的最大值——很容易让我们联想到滑动窗口问题,于是通过单调队列来解决就好了。
下面的代码贴的是以上之中方法……
刚才我们提到了可以用一维来解决,即$f[i]$表示前$i$头奶牛的最大效率。其实是与二维一模一样的,二维实在是多此一举。由于$i-j$根本不选,我们可以直接继承$f[i-j-1]$,在加上前缀和,就有了方程$$f[i][1] = Max(f[i-j-1] - sum[i-j]) + sum[i]$$
Code
long long
/*By QiXingzhi*/ #include <cstdio> #define N (100010) #define INF (0x3f3f3f3f) #define Max(a,b) (((a)>(b)) ? (a) : (b)) #define Min(a,b) (((a)<(b)) ? (a) : (b)) #define r read() typedef long long ll; #define int ll using namespace std; inline int read(){ ; ; register int c = getchar(); ')) c = getchar(); , c = getchar(); ) +(x << ) + c - ', c = getchar(); return x * w; } ,t; ],q[N],s[N]; inline void Push(int w){ ]-s[w] > f[q[t]][]-s[q[t]]) --t; q[++t] = w; } #undef int int main(){ #define int ll n=r,k=r; ; i <= n; ++i){ a[i]=r; s[i] = s[i-]+a[i]; } f[][] = ; f[][] = a[]; Push(); Push(); ; i <= n; ++i){ f[i][] = Max(f[i-][], f[i-][]); while(h<=t && q[h] < i-k) ++h; f[i][] = f[q[h]][] + s[i] - s[q[h]]; Push(i); } printf(],f[n][])); ; }
[洛谷P2627] 修剪草坪的更多相关文章
- 洛谷 P2627 修剪草坪 题解
P2627 修剪草坪 题目描述 在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,Farm John希望能够再次夺冠. 然而,Fa ...
- P2627 修剪草坪
P2627 修剪草坪 题目描述 在一年前赢得了小镇的最佳草坪比赛后,Farm John变得很懒,再也没有修剪过草坪.现在,新一轮的最佳草坪比赛又开始了,Farm John希望能够再次夺冠. 然而,Fa ...
- luogu P2627 修剪草坪
传送门 单调队列优化dp板子 表示不大想写详细做法,自己看代码吧qwq (懒) 注意细节,不然就会跟我一样WA4次 // luogu-judger-enable-o2 #include<bits ...
- P2627 修剪草坪 (单调队列优化$dp$)
题目链接 Solution 70分很简单的DP,复杂度 O(NK). 方程如下: \[f[i][1]=max(f[j][0]+sum[i]-sum[j])\]\[f[i][0]=max(f[i-1][ ...
- 洛谷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的意义表示断点 ...
- 洛谷1640 bzoj1854游戏 匈牙利就是又短又快
bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...
- 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.
没有上司的舞会 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP
题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...
随机推荐
- 07 YAPI/基础设施 - DevOps之路
07 YAPI/基础设施 - DevOps之路 文章Github地址,欢迎start:https://github.com/li-keli/DevOps-WiKi 简介 YApi 是一个可本地部署的. ...
- Codeforces Round #533 (Div. 2) A. Salem and Sticks(暴力)
A. Salem and Sticks time limit per test 1 second memory limit per test 256 megabytes input standard ...
- Python之加密模块
hashlib模块 加密方式以md5方式加密举例 是标准模块,直接导入即可 还有其他的加密方式,比如:.sha1()..sha224()..sha256()等,加密后的字符串长度更长,安全性更高 一. ...
- hadoop实例-网站用户行为分析
一.数据集 网站用户购物行为数据集2030万条,包括raw_user.csv(2000万条)和small_user.csv(30万条,适合新手) 字段说明: user_id 用户编号,item_id ...
- 二、npm scripts
一.执行原理 安装npm 包,会将其package.json bin 字段添加到node_modules bin 里面,创建对应的.cmd文件,因此: 例如: "scripts": ...
- gulp项目和webpack项目在浏览器中查看的方式
在存在.git的目录下,按住shift+左键,打开命令行或者使用git Bash Gulp: 输入gulp dev 本地起一个服务器,在项目中找到gulp.js,然后找本地服务器,找到host和por ...
- HDU 5782 Cycle —— KMP
题目:Cycle 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5782 题意:给出两个字符串,判断两个字符串的每一个前缀是否循环相等(比如abc 和 ca ...
- Linux基础学习笔记2-文件管理和重定向
本节内容 1)文件系统结构元素 2)创建和查看文件 3)复制.转移和删除文件 4)软和硬链接 5)三种I/O设备 6)把I/O重定向至文件 7)使用管道 文件系统和结构 文件系统 文件和目录被组织成一 ...
- NIO服务器与客户端
这里客户端没有采用NIO形式 服务器: package com.util.Server.NIO; import javax.print.DocFlavor;import java.io.IOExcep ...
- linux重装系统,如何保存硬盘中的内容
以前没有太关注重装系统如何保留下硬盘中的内容.但是最近有一些文件在重装系统后确实需要继续保留下来,于是花了点时间了解下磁盘分区相关的东东. 参考 http://blog.csdn.net/openn/ ...