P5858 Golden Swold
写在前面
简单的单调队列优化 DP
处理略微有点恶心,于是乎,用来取 \(\max\) 的极小值直接开到了 long long 的最小极限,了 define int long long /cy
算法思路
必须按编号顺序加材料,明显的阶段性,且数据范围明显地提示我们可以 DP
状态也很好想,设 \(f_{i, j}\) 表示放完前 \(i\) 个物品后锅内有 \(j\) 个物品时的最大答案。
那么使用填表法转移:
\]
那么发现 \(k\) 的取值范围随着 \(j\) 的变化刚好是个滑动窗口,其余的项都是输入时或枚举过程中的定值,因此使用单调队列优化取最大值的操作。
另外表示阶段的 \(i\) 只会取到上一个阶段的答案,因此开滚动数组压掉第一维。
Tips
建议把可能需要开 long long 的都打开,如果不觉得很傻或者比较懒的话也可以直接 define int long long。
内层循环可以倒序枚举,这样就只需要一开始的时候往单调队列里压一个元素。不用乱七八糟的处理。
初始化极小值的时候要足够小亲测 \(-10^{12}\) 都不够用,还不能在加上一些负值之后爆 long long 的最小范围。
Code
/*
By chen_green
2020/11/5
设 f[i][j]表示放完前 i 件物品后锅中已经放了 j 件物品的最大耐久度
f[i][j] = max{f[i - 1][k]} + j * a[i] (j - 1 <= k <= j - 1 + s)
滚动数组 + 单调队列优化
*/
#include <bits/stdc++.h>
#define int long long
#define LL long long
using namespace std;
inline int read0() {
int fh = 1, w = 0; char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') fh = -1;
for (; isdigit(ch); ch = getchar()) w = (w << 3) + (w << 1) + (ch ^ '0');
return fh * w;
}
inline LL read() {
LL fh = 1, w = 0; char ch = getchar();
for (; !isdigit(ch); ch = getchar()) if (ch == '-') fh = -1;
for (; isdigit(ch); ch = getchar()) w = (w << 3) + (w << 1) + (ch ^ '0');
return fh * w;
}
const int Maxn = 5505;
LL f[2][Maxn];
LL a[Maxn];
int n, w, s;
deque<LL> dq;
void initdq() {while(!dq.empty()) dq.pop_back();}
void push(int x) {
if((int)dq.size() >= (int)(s + 1)) dq.pop_front();
while((!dq.empty()) && (dq.back() <= x)) dq.pop_back();
dq.push_back(x);
}
LL Getmax() {
return dq.front();
}
signed main() {
n = read0(); w = read0(); s = read0();
for(register int i = 1; i <= n; ++i) {
a[i] = read();
}
for(register int i = 0; i <= w; ++i) f[0][i] = f[1][i] = -9223372036854775808 / 2;
LL f0 = f[0][0];
f[0][0] = 0;
LL ans = -9223372036854775808;
for(register int i = 1; i <= n; ++i) {
if(i == 2) f[0][0] = f0;
initdq();
push(f[i - 1 & 1][w]);
for(register int j = w; j >= 1; --j) {
push(f[i - 1 & 1][j - 1]);
f[i & 1][j] = Getmax() + j * a[i];
//cout << f[i & 1][j] << " ";
}
}
for(int i = 1; i <= w; ++i) {
ans = max(ans, f[n & 1][i]);
}
printf("%lld", ans);
}
P5858 Golden Swold的更多相关文章
- P5858 「SWTR-03」Golden Sword
题面: Link 题面有点长,不想粘了,QAQ. 题解: 一句话题意,你有 \(n\) 件物品需要依次放进去,每个物品放进去之后会得到一定的权值,为当前锅炉里面的物品的数量乘以 \(a_i\) 每次在 ...
- Why The Golden Age Of Machine Learning is Just Beginning
Why The Golden Age Of Machine Learning is Just Beginning Even though the buzz around neural networks ...
- C Golden gun的巧克力
Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: 无限制 描述 众所周知,13级有尊大神Golden gun,人称根叔,简称金枪!众立志进校队的 ...
- 10 Golden Rules of Project Risk Management
The benefits of risk management in projects are huge. You can gain a lot of money if you deal with u ...
- The golden ratio: 1.618
http://www.chinaz.com/design/2015/1109/467968_2.shtml The golden ratio: 1.618 a/b=b/(a+b) The Fibona ...
- 【UVA 11383】 Golden Tiger Claw (KM算法副产物)
Omi, Raymondo, Clay and Kimiko are on new adventure- in search of new Shen Gong Wu. But EvilBoy Geni ...
- Golden Pyramid
Golden Pyramid Our Robo-Trio need to train for future journeys and treasure hunts. Stephan has built ...
- Oracle Golden Gate - 概念和机制 (ogg)
Golden Gate(简称OGG)提供异构环境下交易数据的实时捕捉.变换.投递. OGG支持的异构环境有: OGG的特性: 对生产系统影响小:实时读取交易日志,以低资源占用实现大交易量数据实时复制 ...
- 转://Oracle Golden Gate 概念和原理
引言:Oracle Golden Gate是Oracle旗下一款支持异构平台之间高级复制技术,是Oracle力推一种HA高可用产品,简称“OGG”,可以实现Active-Active 双业务中心架构 ...
随机推荐
- Redis基础篇(五)AOF与RDB比较和选择策略
RDB和AOF对比 关于RDB和AOF的优缺点,官网上面也给了比较详细的说明redis.io/topics/pers- RDB 优点: RDB快照是一个压缩过的非常紧凑的文件,保存着某个时间点的数据集 ...
- Android Studio连接手机调试教程已决解
Android Studio连接手机调试教程 Windows电脑连接安卓手机需要下载安装驱动,确保电脑联上网络. 准备条件: 1.电脑上安装应用宝软件. 2.手机开发者选项里面打开USB调试,USB安 ...
- 耗子大叔弹窗来自百度搜索引擎导流的弹窗JS源码赏析
刚看到https://coolshell.cn/articles/9308.html 耗子大叔评价梁斌站点被百度封杀事件言论 然后在自己个人网站酷壳网站上发布了一段JS代码 当请求来自百度导流过来 ...
- ConcurrentHashMap 并发之美
一.前言 她如暴风雨中的一叶扁舟,在高并发的大风大浪下疾驰而过,眼看就要被湮灭,却又在绝境中绝处逢生 编写一套即稳定.高效.且支持并发的代码,不说难如登天,却也绝非易事. 一直有小伙伴向我咨询关于Co ...
- 风炫安全WEB安全学习第二十五节课 利用XSS键盘记录
风炫安全WEB安全学习第二十五节课 利用XSS键盘记录 XSS键盘记录 同源策略是浏览器的一个安全功能,不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源.所以xyz.com下的js脚本采用a ...
- js 判断用户是手机端还是电脑端访问
通过userAgent 判断,网页可以直接使用 navigation对象 node端 可以通过请求头的 ctx.request.header['user-agent'] const browser = ...
- 【JavaWeb】Filter 过滤器
Filter 过滤器 简介 Filter 过滤器是 JavaWeb 三大组件之一 Filter 过滤器是 JavaEE 的规范,也就是接口 Filter 过滤器的作用是 拦截请求,过滤响应 拦截请求的 ...
- 3.利用jmeter制作性能脚本
jmeter录制脚本示例 jmeter手工脚本编写与调试 业务逻辑实现之逻辑控制器 业务脚本参数化实现 jmeter处理cookie beanshell脚本 ...
- 如何构建一个多人(.io) Web 游戏,第 1 部分
原文:How to Build a Multiplayer (.io) Web Game, Part 1 GitHub: https://github.com/vzhou842/example-.io ...
- 【十天自制软渲染器】DAY 02:画一条直线(DDA 算法 & Bresenham’s 算法)
推荐关注公众号「卤蛋实验室」或访问博客原文,更新更及时,阅读体验更佳 第一天我们搭建了 C++ 的运行环境并画了一个点,根据 点 → 线 → 面 的顺序,今天我们讲讲如何画一条直线. 本文主要讲解直线 ...