AcWing 1087. 修剪草坪28
AcWing 1087. 修剪草坪
题意:
有n个数,不能选超过连续的k个数,问所能选的最大值是多少?
题解:
我们首先分析dp过程:
dp[i]表示选择完前i个数的最大值
sum[i]表示前i项和
对于第i个数,它有两个情况,选和不选
1.不选,dp[i]=dp[i-1]
2.选,那么以i为结尾的连续长度可以为1,也可以为2。。。,我们设所选的连续长度为j(1<=j<=k),那么这个区间就是[i-j+1,i],而第i-j个数就不选,再往前的区间答案就是dp[i-j-1]
所以此时dp[i]=dp[i-j-1]+sum[i]-sum[i-j]
i是固定的,j是不固定的,所以我们将式子变下形
dp[i]=(dp[i-j-1]-sum[i-j]) +sum[i] = g[i-j]+sum[i]
令g[i]=dp[i-1]-sum[i],这样我们要让dp[i]最大,就要让g[i-j]最大,单调队列维护下降序列得到区间长度为k的g[i]的最大值
代码:
#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\n",a,b);
typedef long long ll;
using namespace std;inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=1e5+9;
ll f[maxn];
ll s[maxn];
int q[maxn];
ll g(int i){if(i==0)return 0;return f[i-1]-s[i];
}
int main()
{int n,k;cin>>n>>k;for(int i=1;i<=n;i++){cin>>s[i];s[i]+=s[i-1];}int hh=0,tt=0;for(int i=1;i<=n;i++){if(q[hh]+k<i)hh++;f[i]=max(f[i-1],g(q[hh])+s[i]);while(hh<=tt&&g(q[tt])<=g(i))tt--;q[++tt]=i;}cout<<f[n];return 0;
}
/*
dp[i]=dp[i-1]
当我们选择连续长度为j时,(1<=j<=k)
dp[i]=dp[i-j-1]+s[i]-s[i-j]
*/
AcWing 1087. 修剪草坪28相关推荐
- BZOJ 2442: [Usaco2011 Open]修剪草坪( dp )
dp dp[ i ] 表示第 i 个不选 , 前 i 个的选择合法的最小损失 , dp[ i ] = min( dp[ j ] ) ( max( 0 , i - 1 - k ) <= j < ...
- bzoj 2442: [Usaco2011 Open]修剪草坪(单调队列)
2442: [Usaco2011 Open]修剪草坪 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1175 Solved: 602 [Submi ...
- BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP
BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP 题意: N头牛,每头牛有一个权值,选择一些牛,要求连续的不能超过k个,求选择牛的权值和最大值 分析: 先考虑暴力DP,f ...
- BZOJ2442: [Usaco2011 Open]修剪草坪 单调队列优化dp
Description 在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪.现在, 新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠. 然而,FJ的草坪非常脏乱,因此,FJ只能够让 ...
- BZOJ 2442: [Usaco2011 Open]修剪草坪 单调队列
Description 在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪.现在, 新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠. 然而,FJ的草坪非常脏乱,因此,FJ只能够让 ...
- AcWing1087.修剪草坪(单调队列DP)
题目传送门 在一年前赢得了小镇的最佳草坪比赛后,FJ 变得很懒,再也没有修剪过草坪. 现在,新一轮的最佳草坪比赛又开始了,FJ 希望能够再次夺冠. 然而,FJ 的草坪非常脏乱,因此,FJ 只能够让他的 ...
- 2202. 修剪草坪
题目描述 在一年前赢得了小镇的最佳草坪比赛后,约翰变得懒惰了,再也没有修剪过草坪.现在,新一轮的比赛又开始了,约翰希望能够再次夺冠.然而,约翰家的草坪非常脏乱,因此,约翰需要让他的奶牛来完成这项工作. ...
- 【DP】【单调队列优化】修剪草坪
题目描述 在一年前赢得了小镇的最佳草坪比赛后,约翰变得懒惰了,再也没有修剪过草坪.现在,新一轮的比赛又开始了,约翰希望能够再次夺冠.然而,约翰家的草坪非常脏乱,因此,约翰需要让他的奶牛来完成这项工作. ...
- BZOJ 2442 [Usaco2011 Open]修剪草坪:单调队列优化dp
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2442 题意: 有n个数a[i]从左到右排成一排. 你可以任意选数,但是连续的数不能超过k个 ...
最新文章
- Java clone浅复制与深复制的区别
- javafx 调用java_Java验证(javafx)
- excel排名_Excel案例:比赛中,如何实时显示排名
- asp.net(c#)网页跳转七种方法小结
- python flask 分页前后端分离_【flask + vue 前后端分离博客】创建第一个 Flask RESTFul(一)...
- java manager 如何使用_java – Android:如何使用AlarmManager
- 搜狐Linux运维工程师面试真题曝光
- python librosa库实现变声
- java基础教程01讲:使用idea写第一个java程序
- h2o api java_h2o 准备
- AndroidStudio下建立libs、raw、、assets、selector、shape、anim、存放so
- 职场小白手收藏篇:职场应聘的面试技巧
- 小程序获取发票详情getinvoiceinfo一直报72031
- 12月10日周日下午广州Linuxer聚会(4大演讲主题+蜗窝大侠郭健主持)
- RuntimeError: NEOS requires a valid email address. Please set the ‘NEOS_EMAIL‘ environment variable.
- 计算Fisher信息之Part(二)
- .NET接入UnionPay银联支付(一)手机wap支付
- 基于BroadCastSend的短信转发
- pta mysql 训练题集 ( 61-80 )
- Node.js---菜鸟教程