SCU-3968 Mowing the Lawn(DP+单调队列)
题意
有 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+单调队列)相关推荐
- URAL 1427. SMS(DP+单调队列)
题目链接 我用的比较传统的办法...单调队列优化了一下,写的有点搓,不管怎样过了...两个单调队列,存两个东西,预处理一个标记数组存... 1 #include <iostream> 2 ...
- POJ 3017 DP + 单调队列 + 堆
题意:给你一个长度为n的数列,你需要把这个数列分成几段,每段的和不超过m,问各段的最大值之和的最小值是多少? 思路:dp方程如下:设dp[i]为把前i个数分成合法的若干段最大值的最小值是多少.dp转移 ...
- 烽火传递(dp+单调队列)
烽火台又称烽燧,是重要的军事防御设施,一般建在险要或交通要道上.一旦有敌情发生,白天燃烧柴草,通过浓烟表达信息:夜晚燃烧干柴,以火光传递军情,在某两座城市之间有 n 个烽火台,每个烽火台发出信号都有一 ...
- [DP/单调队列]BZOJ 2059 [Usaco2010 Nov]Buying Feed 购买饲料
首先我想吐槽的是题目并没有表明数据范围... 这个题目 DP方程并不难表示. dp[i][j]表示前i个地点携带了j个货物的最小花费 dp[i][j] = dp[i-1][k] + (j-k) * c ...
- bzoj1791,P4381-[IOI2008]Island【基环树,树形dp,单调队列dp,树的直径】
正题 评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P4381 题目大意 有n个岛,n条无向边(保证每个岛都有边连到).走过 ...
- bzoj2500幸福的道路 树形dp+单调队列
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 434 Solved: 170 [Submit][Status][Discu ...
- Codeforces Round #521 (Div. 3): F. Pictures with Kittens(DP+单调队列)
题意: 你有n幅画,第i幅画的好看程度为ai,再给你两个数字k,x,表示你要从中选出刚好x幅画,并且相邻两幅画的距离不能≥k,好看程度之和最大能多少,选不出来输出-1,F1数据范围<200,F2 ...
- Codeforces 1077F2 Pictures with Kittens (hard version)(DP+单调队列优化)
题目链接:Pictures with Kittens (hard version) 题意:给定n长度的数字序列ai,求从中选出x个满足任意k长度区间都至少有一个被选到的最大和. 题解:数据量5000, ...
- bzoj5185 [Usaco2018 Jan]Lifeguards(dp+单调队列优化)
真是太神了orz 我们先贪心地把被包含的线段删掉,把剩下的线段按左端点排序,这样的话右端点显然也是有序的. 设dp[i][k],表示前i个线段,删了k个,且必须保留i线段的最大覆盖长度.枚举上一个线段 ...
- AcWing 1089 烽火传递 题解(动态规划—DP—单调队列优化DP)
AcWing 1089 烽火传递 单调队列优化DP,思路比较简单,维护一个保持元素单调递增的单调队列,队首就是第i座烽火台能接收到的,代价最小的方案,加上第i座烽火台的代价就是这座烽火台的最小值 #i ...
最新文章
- Ceilometer Polling Performance Improvement
- sqlserver获取当月、年的第一天和最后一天
- OpenStack配置keystone报错HTTP500
- 池化方法总结(Pooling)
- 【转载】COM 连接点
- Qt Creator编辑状态图
- 飞鸽传书 扩散全身的
- 请求时才延迟加载JavaScript文件 - 优化篇
- ubuntu 开机自动挂在windows下的分区
- jdk,Eclipse,SWTDesigner安装【原创】
- 【推荐】HTML5 Word Cloud——中文词云
- 自动生成员工号c语言,C语言课程设计级.doc
- 三大方面解析虚拟化技术在云计算数据中心中的应用
- 赢在互联网的起跑线上
- 关于ONVIF协议你不得不知的6个常见问题
- IPFS发展前景真有说的那么好么?
- USB键盘背后的那些事儿
- 哪看计算机的网络密码,如何检查计算机的无线网络密码?两种查看方法
- AI人工智能外呼机器人测试项目经历
- 没有学历的程序员上限很低吗?BATZ面试评分最高的我,因为学历止步大厂......
热门文章
- 后盾网原创实战网站建设教程【PS切片+html+div+css+织梦后台...
- 爱情:溺水三千只取一瓢饮
- Git使用小技巧之挑拣合并
- 体胖还需勤跑步,人丑就该多读书!
- effective python pdf下载-《Effective Python》电子书pdf下载百度网盘
- CV战神常用代码-----kj15
- 计算机炫酷功能,【实用】上班族必备!10个实用电脑炫酷小技巧~
- QQ浏览器微信版抢先玩!变QQ微信电脑版
- 商城订单实时语音提醒功能JavaScript部分 附提醒语音音频文件
- Android 跳转外部浏览器