题意

有 nnn 个非负整数,选若干个数保证连续的数不超过 k" role="presentation" style="position: relative;">kkk 个,求选的数总和最大是多少。
1≤n≤1000001≤n≤1000001 \leq n \leq 100000

思路

为了方便考虑问题,我们把题干转化为选若干个数,且间隔的数不超过 kkk个,求选的数总和最小是多少。
设 dpi" role="presentation" style="position: relative;">dpidpidp_i 为最后一个选的数为 iii 时的最小总和,按照题设不难列出方程:
dpi=min{dpj}+ai" role="presentation" style="position: relative;">dpi=min{dpj}+aidpi=min{dpj}+aidp_i=min\{dp_j\}+a_i j∈[i−k−1,i−1]j∈[i−k−1,i−1]j \in [i-k-1,i-1]
考虑用单调队列优化,不难发现,只要在枚举 iii 时,实时维护 dpi−k−1" role="presentation" style="position: relative;">dpi−k−1dpi−k−1dp_{i-k-1} 到 dpi−1dpi−1dp_{i-1} 的最小值即可,这可以用单调队列实现。

代码

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#define FOR(i,x,y) for(int i=(x);i<=(y);i++)
#define DOR(i,x,y) for(int i=(x);i>=(y);i--)
#define N 100003
typedef long long LL;
using namespace std;
LL E[N],dp[N];bool cmp1(LL x,LL y){return x<y;}
template<LL *a,bool cmp(LL,LL)>struct monoque
{                 //单调队列模板,对于a数组的,队头到队尾单调性为cmp的单调队列,队头是Lint q[N],L,R;monoque(){L=1,R=0;}void clear(){L=1,R=0;}void del(int _){while(L<=R&&!cmp(a[q[R]],a[_]))R--;}void push(int _){q[++R]=_;}int front(){return q[L];}int rear(){return q[R];}void pop(int _){if(_>=q[L])L++;}
};
monoque<dp,cmp1>mq;int main()
{int n,k;while(~scanf("%d%d",&n,&k)){LL sum=0,ans=1e18;FOR(i,1,n){scanf("%d",&E[i]);sum+=E[i];}E[n+1]=0;dp[0]=0;mq.clear();mq.push(0);FOR(i,1,n+1){dp[i]=dp[mq.front()]+E[i];mq.del(i);mq.push(i);mq.pop(i-k-1);}printf("%lld\n",sum-dp[n+1]);}return 0;
}

SCU-3968 Mowing the Lawn(DP+单调队列)相关推荐

  1. URAL 1427. SMS(DP+单调队列)

    题目链接 我用的比较传统的办法...单调队列优化了一下,写的有点搓,不管怎样过了...两个单调队列,存两个东西,预处理一个标记数组存... 1 #include <iostream> 2 ...

  2. POJ 3017 DP + 单调队列 + 堆

    题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移 ...

  3. 烽火传递(dp+单调队列)

    烽火台又称烽燧,是重要的军事防御设施,一般建在险要或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情,在某两座城市之间有 n 个烽火台,每个烽火台发出信号都有一 ...

  4. [DP/单调队列]BZOJ 2059 [Usaco2010 Nov]Buying Feed 购买饲料

    首先我想吐槽的是题目并没有表明数据范围... 这个题目 DP方程并不难表示. dp[i][j]表示前i个地点携带了j个货物的最小花费 dp[i][j] = dp[i-1][k] + (j-k) * c ...

  5. bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】

    正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P4381 题目大意 有n个岛,n条无向边(保证每个岛都有边连到).走过 ...

  6. bzoj2500幸福的道路 树形dp+单调队列

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 434  Solved: 170 [Submit][Status][Discu ...

  7. Codeforces Round #521 (Div. 3): F. Pictures with Kittens(DP+单调队列)

    题意: 你有n幅画,第i幅画的好看程度为ai,再给你两个数字k,x,表示你要从中选出刚好x幅画,并且相邻两幅画的距离不能≥k,好看程度之和最大能多少,选不出来输出-1,F1数据范围<200,F2 ...

  8. Codeforces 1077F2 Pictures with Kittens (hard version)(DP+单调队列优化)

    题目链接:Pictures with Kittens (hard version) 题意:给定n长度的数字序列ai,求从中选出x个满足任意k长度区间都至少有一个被选到的最大和. 题解:数据量5000, ...

  9. bzoj5185 [Usaco2018 Jan]Lifeguards(dp+单调队列优化)

    真是太神了orz 我们先贪心地把被包含的线段删掉,把剩下的线段按左端点排序,这样的话右端点显然也是有序的. 设dp[i][k],表示前i个线段,删了k个,且必须保留i线段的最大覆盖长度.枚举上一个线段 ...

  10. AcWing 1089 烽火传递 题解(动态规划—DP—单调队列优化DP)

    AcWing 1089 烽火传递 单调队列优化DP,思路比较简单,维护一个保持元素单调递增的单调队列,队首就是第i座烽火台能接收到的,代价最小的方案,加上第i座烽火台的代价就是这座烽火台的最小值 #i ...

最新文章

  1. Ceilometer Polling Performance Improvement
  2. sqlserver获取当月、年的第一天和最后一天
  3. OpenStack配置keystone报错HTTP500
  4. 池化方法总结(Pooling)
  5. 【转载】COM 连接点
  6. Qt Creator编辑状态图
  7. 飞鸽传书 扩散全身的
  8. 请求时才延迟加载JavaScript文件 - 优化篇
  9. ubuntu 开机自动挂在windows下的分区
  10. jdk,Eclipse,SWTDesigner安装【原创】
  11. 【推荐】HTML5 Word Cloud——中文词云
  12. 自动生成员工号c语言,C语言课程设计级.doc
  13. 三大方面解析虚拟化技术在云计算数据中心中的应用
  14. 赢在互联网的起跑线上
  15. 关于ONVIF协议你不得不知的6个常见问题
  16. IPFS发展前景真有说的那么好么?
  17. USB键盘背后的那些事儿
  18. 哪看计算机的网络密码,如何检查计算机的无线网络密码?两种查看方法
  19. AI人工智能外呼机器人测试项目经历
  20. 没有学历的程序员上限很低吗?BATZ面试评分最高的我,因为学历止步大厂......

热门文章

  1. 后盾网原创实战网站建设教程【PS切片+html+div+css+织梦后台...
  2. 爱情:溺水三千只取一瓢饮
  3. Git使用小技巧之挑拣合并
  4. 体胖还需勤跑步,人丑就该多读书!
  5. effective python pdf下载-《Effective Python》电子书pdf下载百度网盘
  6. CV战神常用代码-----kj15
  7. 计算机炫酷功能,【实用】上班族必备!10个实用电脑炫酷小技巧~
  8. QQ浏览器微信版抢先玩!变QQ微信电脑版
  9. 商城订单实时语音提醒功能JavaScript部分 附提醒语音音频文件
  10. Android 跳转外部浏览器