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相关推荐

  1. BZOJ 2442: [Usaco2011 Open]修剪草坪( dp )

    dp dp[ i ] 表示第 i 个不选 , 前 i 个的选择合法的最小损失 , dp[ i ] = min( dp[ j ] ) ( max( 0 , i - 1 - k ) <= j < ...

  2. bzoj 2442: [Usaco2011 Open]修剪草坪(单调队列)

    2442: [Usaco2011 Open]修剪草坪 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1175  Solved: 602 [Submi ...

  3. BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP

    BZOJ_2343_[Usaco2011 Open]修剪草坪 _单调队列_DP 题意: N头牛,每头牛有一个权值,选择一些牛,要求连续的不能超过k个,求选择牛的权值和最大值 分析: 先考虑暴力DP,f ...

  4. BZOJ2442: [Usaco2011 Open]修剪草坪 单调队列优化dp

    Description 在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪.现在, 新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠. 然而,FJ的草坪非常脏乱,因此,FJ只能够让 ...

  5. BZOJ 2442: [Usaco2011 Open]修剪草坪 单调队列

    Description 在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪.现在, 新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠. 然而,FJ的草坪非常脏乱,因此,FJ只能够让 ...

  6. AcWing1087.修剪草坪(单调队列DP)

    题目传送门 在一年前赢得了小镇的最佳草坪比赛后,FJ 变得很懒,再也没有修剪过草坪. 现在,新一轮的最佳草坪比赛又开始了,FJ 希望能够再次夺冠. 然而,FJ 的草坪非常脏乱,因此,FJ 只能够让他的 ...

  7. 2202. 修剪草坪

    题目描述 在一年前赢得了小镇的最佳草坪比赛后,约翰变得懒惰了,再也没有修剪过草坪.现在,新一轮的比赛又开始了,约翰希望能够再次夺冠.然而,约翰家的草坪非常脏乱,因此,约翰需要让他的奶牛来完成这项工作. ...

  8. 【DP】【单调队列优化】修剪草坪

    题目描述 在一年前赢得了小镇的最佳草坪比赛后,约翰变得懒惰了,再也没有修剪过草坪.现在,新一轮的比赛又开始了,约翰希望能够再次夺冠.然而,约翰家的草坪非常脏乱,因此,约翰需要让他的奶牛来完成这项工作. ...

  9. BZOJ 2442 [Usaco2011 Open]修剪草坪:单调队列优化dp

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2442 题意: 有n个数a[i]从左到右排成一排. 你可以任意选数,但是连续的数不能超过k个 ...

最新文章

  1. Java clone浅复制与深复制的区别
  2. javafx 调用java_Java验证(javafx)
  3. excel排名_Excel案例:比赛中,如何实时显示排名
  4. asp.net(c#)网页跳转七种方法小结
  5. python flask 分页前后端分离_【flask + vue 前后端分离博客】创建第一个 Flask RESTFul(一)...
  6. java manager 如何使用_java – Android:如何使用AlarmManager
  7. 搜狐Linux运维工程师面试真题曝光
  8. python librosa库实现变声
  9. java基础教程01讲:使用idea写第一个java程序
  10. h2o api java_h2o 准备
  11. AndroidStudio下建立libs、raw、、assets、selector、shape、anim、存放so
  12. 职场小白手收藏篇:职场应聘的面试技巧
  13. 小程序获取发票详情getinvoiceinfo一直报72031
  14. 12月10日周日下午广州Linuxer聚会(4大演讲主题+蜗窝大侠郭健主持)
  15. RuntimeError: NEOS requires a valid email address. Please set the ‘NEOS_EMAIL‘ environment variable.
  16. 计算Fisher信息之Part(二)
  17. .NET接入UnionPay银联支付(一)手机wap支付
  18. 基于BroadCastSend的短信转发
  19. pta mysql 训练题集 ( 61-80 )
  20. Node.js---菜鸟教程

热门文章

  1. 性冷淡风的麻将,获红点奖!网友:没有烟火气了
  2. 万万想不到:吸烟的辐射量比原子弹爆炸点还厉害!
  3. 12个关键词,告诉你到底什么是机器学习
  4. 一起读懂传说中的经典:受限玻尔兹曼机
  5. 掌握Python爬虫基础,仅需1小时!
  6. 简约而不简单的 Django 新手图文教程
  7. 数据挖掘在呼叫中心的六大应用点
  8. 小猿学python_小猿圈python入门之转行零基础该如何学Python?
  9. php正则获取标签,PHP通过正则匹配中文字符 过滤html标签 获取文本内容
  10. n以内的素数c语言,关于求N以内素数的一点小问题(N小于一亿)