单调队列:就是滑动窗口,可以求出定长 RMQ,时间复杂度线性。

优化 DP

首先把dp方程写成这个样子:

或者其他运算f[i]=max(或者其他运算){f[j]+calc(i,j)}<script type="math/tex;mode=inline" id="MathJax-Element-3">f[i] = max(\text{或者其他运算})\{f[j]+calc(i,j)\}</script>f[i] = max(\text{或者其他运算})\{f[j]+calc(i,j)\}

注意 calc 的计算要能只和 j 有关。

同时 j 满足一个定长的范围,也就是说转移是从一个定长区间来的。

P3572 [POI2014] PTA-Little Bird,P1725 琪露诺:完全的模版。

在此不妨以P3957 [NOIP2017 普及组] 跳房子为例。

首先意识到本题答案满足单调性,灵活性的定义也符合人类想象(越灵活,可能得到的答案就越大),于是首先二分 k 的值,然后考虑 k 确定时的做法。

根据题目灵活性的定义,实际上能跳的范围就是 [max(d−g,1),d+g]<script type="math/tex;mode=inline" id="MathJax-Element-1">[\max(d-g,1),d+g]</script>[\max(d-g,1),d+g] ,满足定长区间, f[i]=f[j]+s[i]<script type="math/tex;mode=inline" id="MathJax-Element-2">f[i]=f[j]+s[i]</script>f[i]=f[j]+s[i] ,那么使用单调队列。

结合一下我的代码:

#include <bits/stdc++.h>
#define int long long
#define U (l+r)/2
#define F(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
const int N=500005,M=(N<<1),inf=1e18;
int n,d,k,x[N],s[N],f[N],q[M];
int ck(int g){
int h=1,t=0,l=0;
fill(f+1,f+n+1,-inf);
F(i,1,n){
while(h<=t&&x[i]-x[q[h]]>d+g) h++;
while(l<i&&x[i]-x[l]>=d-g){
while(h<=t&&f[l]>=f[q[t]])t--;
q[++t] = l++;
}if(h<=t)f[i]=f[q[h]]+s[i];
if(f[i]>=k) return 1;
}return 0;
}
signed main(){
ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>n>>d>>k;F(i,1,n) cin>>x[i]>>s[i];
int l=0,r=1e9,ans=-1;while(l<=r)
ck(U)?ans=U,r=U-1:l=U+1;
cout<<ans; return 0;
}

首先,对超出范围的,进行删除,然后对符合条件的,进行加入,最后直接转移答案。

CF372C Watching Fireworks is Fun

这题有点启示作用,当 k 满足 j−x<k<j<script type="math/tex;mode=inline" id="MathJax-Element-4">j-xj-x<k<j 的时候显然直接单调队列。然而这道题会推出来一个这样的式子: j−x<k<j+x<script type="math/tex;mode=inline" id="MathJax-Element-9">j-xj-x<k<j+x 。做法是拆成两段,一段满足 j−x<k≤j<script type="math/tex;mode=inline" id="MathJax-Element-5">j-xj-x<k\le j ,另一段是 j≤k<j+x<script type="math/tex;mode=inline" id="MathJax-Element-6">j\le kj\le k<j+x ,可以两次单调队列秒掉。

具体的,我们把状态设为 f[i][j]<script type="math/tex;mode=inline" id="MathJax-Element-8">f[i][j]</script>f[i][j] ,表示放第 i 个烟花的时候在 j 点能得到的最大值, f[i][j]=max{f[i−1][k]+b[i]−|a[i]−j|}<script type="math/tex;mode=inline" id="MathJax-Element-7">f[i][j]=\max\{f[i-1][k]+b[i]-\left| a[i]-j \right|\}</script>f[i][j]=\max\{f[i-1][k]+b[i]-\left| a[i]-j \right|\} ,同时 k 能走到 j 点(即定长区间的最值)。

P2569 [SCOI2010] 股票交易:

转移多一点的时候只需要去先写朴素的方程,然后优化。

注意,尽量使用数组代替deque,因为这个东西很慢(虽然有些题实测差距不大)。

算法学习笔记【8】| 单调队列优化DP的更多相关文章

  1. 「学习笔记」单调队列优化dp

    目录 算法 例题 最大子段和 题意 思路 代码 修剪草坪 题意 思路 代码 瑰丽华尔兹 题意 思路 代码 股票交易 题意 思路 代码 算法 使用单调队列优化dp 废话 对与一些dp的转移方程,我们可以 ...

  2. bzoj1499: [NOI2005]瑰丽华尔兹&&codevs1748 单调队列优化dp

    这道题 网上题解还是很多很好的 强烈推荐黄学长 码风真的好看 神犇传送门 学习学习 算是道单调队列优化dp的裸题吧 #include<cstdio> #include<cstring ...

  3. 【笔记篇】单调队列优化dp学习笔记&&luogu2569_bzoj1855股票交♂易

    DP颂 DP之神 圣洁美丽 算法光芒照大地 我们怀着 崇高敬意 跪倒在DP神殿里 你的复杂 能让蒟蒻 试图入门却放弃 在你光辉 照耀下面 AC真心不容易 dp大概是最经久不衰 亘古不化的算法了吧. 而 ...

  4. 算法笔记--单调队列优化dp

    单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队. 单调队列优化dp: 问题引入: dp[i] = min( a[j] ) ,i-m < j ...

  5. 【学习笔记】动态规划—斜率优化DP(超详细)

    [学习笔记]动态规划-斜率优化DP(超详细) [前言] 第一次写这么长的文章. 写完后感觉对斜优的理解又加深了一些. 斜优通常与决策单调性同时出现.可以说决策单调性是斜率优化的前提. 斜率优化 \(D ...

  6. Parade(单调队列优化dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    ...

  7. 2018.09.10 bzoj1499: [NOI2005]瑰丽华尔兹(单调队列优化dp)

    传送门 单调队列优化dp好题. 这题其实很简单. 我们很容易想到一个O(T∗n∗m)" role="presentation" style="position: ...

  8. 1855: [Scoi2010]股票交易[单调队列优化DP]

    1855: [Scoi2010]股票交易 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1083  Solved: 519[Submit][Status] ...

  9. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

  10. bzoj1855: [Scoi2010]股票交易--单调队列优化DP

    单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...

随机推荐

  1. springboot集成腾讯cos实现文件上传

    腾讯对象存储介绍 对象存储(Cloud Object Storage,COS)是腾讯云提供的一种存储海量文件的分布式存储服务,具有高扩展性.低成本.可靠安全等优点.通过控制台.API.SDK 和工具等 ...

  2. image could not be accessed on a registry to record its digest

    问题说明: 在管理节点执行docker stack xxx 方式运行服务,报如题错误. 问题原因: docker swarm运行需要一个镜像仓库才行,所有节点都去这个仓库统一镜像. 来看下官方的解释: ...

  3. SIP协议解析

    起始行(start-line) INVITE sip:34020000001320000001@202.102.11.27:35611 SIP/2.0 请求消息的起始行包括三个参数,格式:Reques ...

  4. go build gcc报错 /usr/bin/ld | cannot find -ldl cannot find -lpthread cannot find -lc

    之前一直在kali或者其他ubuntu设备编译sliver, 临时在centos7上编译时报错了 # github.com/bishopfox/sliver/server /usr/local/go/ ...

  5. Golang Web 框架 Gin 基础学习教程集合目录

    Gin Web 框架基础学习系列目录 01-quickstart 02-parameter 03-route 04-middleware 05-log 06-logrus 07-bind 08-val ...

  6. logback 常用配置(详解)

    转自:https://blog.csdn.net/qq_36850813/article/details/83092051 官方文档参考:https://logback.qos.ch/manual/a ...

  7. 红胖子(红模仿)的博文大全:开发技术集合大版本更新v4.0.0

    <红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术.树莓派.三维.OpenCV.OpenGL.ffmpeg.OSG.单片机.软硬结合等等)持续更新中...>大版本更新,更新后版本 ...

  8. __init_subclass__特殊方法

    __init_subclass__ 是 Python 3.6 引入的一个特殊方法,用于在子类被定义时执行一些操作. 这个方法允许你在父类中定义一个类方法,当子类继承父类时会自动调用这个方法,你可以在其 ...

  9. drf中认证源码流程

    drf中认证流程 首先通过导入from rest_framework.views import APIView,然后通过ctrl+鼠标右键进入到APIView类中,apiview中定义了许多方法,我们 ...

  10. Android内存优化—内存优化总结

    内存优化总结 内存问题 内存抖动:导致GC导致卡顿 内存泄漏:导致频繁GC,可用内存减少 内存溢出:导致OOM 工具排查 AS中的Profiler查看内存情况,是否锯齿状,是否持续上升 MAT排查 L ...