热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

『动态规划的单调性优化』

动态规划的单调性优化1.决策集合优化\(\mathrm{dp}\)的时候决策集合只扩大不减小,直接把最大值\(\)最小值\(\)累加和记下来就好了.例如:\(\mathrm{LCI

动态规划的单调性优化


1. 决策集合优化

\(\mathrm{dp}\)的时候决策集合只扩大不减小,直接把最大值\(/\)最小值\(/\)累加和记下来就好了.

例如:\(\mathrm{LCIS\ CH5101}\),\(f_{i,j}=\max\limits_{0\leq k

外层\(i\)不变,随着\(j\)增大,每次决策\(k\)最多增加一个,判断一下是否合法记下来即可.


2. 单调队列优化

\(\mathrm{dp}\)的时候决策区间上下界都单调变化,可以直接记录区间和的值. 如果是最优化\(\mathrm{dp}\),那就要用滑动窗口记录区间最值.

写代码的时候,在循环开始的时候排除队首过期决策,然后取队首作为最优解,然后加入新决策. 有些边界麻烦的初值可以暴力算掉.

多重背包怎么用单调队列优化?先写方程:\(f[j]=\max\limits_{1\leq k\leq c_i}\{f[j-k\times v_i]+k\times w_i\}\).

观察:决策点每次位移\(v_i\),那就把\(j\)按照\(v_i\)的余数分类. 设\(j=u+v_i\times p\),于是:

\[f[u+v_i\times p]=\max\limits_{\max\{0,p-c_i\}\leq k\leq p-1}\{f[u+v_i\times k]+(p-k)\times w_i\}
\]

这样的话可以把\(i,u\)当成定值,枚举\(p\),此时决策变量\(k\)的上下界单调变化,就可以用单调队列了.


3. 斜率优化

多项式\(v(i,j)\)含有\(i,j\)乘积项的\(1D/1D\)动态规划,一般可以用单调队列维护下凸壳\(/\)上凸壳.

设\(f_i=\max\limits_{0\leq j\leq i-1}\{f_j+A(i)+B(j)+p(i)q(j)\}\),然后移项一下:

\[f_j+B(j)=-p(i)q(j)-A(i)+f_i
\]

这时候把所有决策点\(j\)看成平面上的点\(P_j(-q(j),f_j+B(j))\),那么现在你要用一条斜率为\(p(i)\)的直线去切这些点,求最小截距.

一般来说,这些点都是单调递增的,所以我们可以用单调队列维护下凸壳作为最优决策集. 如果\(p(i)\)也是单调的,只要在队首操作最优决策即可,如果\(p(i)\)不单调,那就二分找最优决策点.

如果这些点不是单调递增的话,那就要用平衡树\(/\)\(\mathrm{cdq}\)分治维护凸壳. 不过用李超树求一次函数最值会更简单.

注意事项有点多:

斜率优化


4. 四边形不等式

直接记结论即可:对于整数域上的二元函数\(w(x,y)\),若其满足:

\[a\leq b\leq c\leq d,w(a,d)+w(b,c)\geq w(a,c)+w(b,d)
\]

或者

\[a\]

则称\(w\)满足四边形不等式.

对于\(f_i=\min\limits_{0\leq j

暴力优化的话直接从上一个决策点开始枚举即可,如果用队列维护决策点连续段可以做到\(O(n\log_2 n)\),需要用二分找分界点. 如果是二维的\(\mathrm{dp}\),每次仅从上一维转移,可以采用分治写法,时间复杂度也是每层\(O(n\log_2 n)\),如果一维\(\mathrm{dp}\)强行套\(\mathrm{cdq}\)分治的话,时间复杂度两个\(\log\).

对于\(f_{i,j}=\min\limits_{i\leq k

\[\forall i

按照长度为阶段的区间\(\mathrm{dp}\),直接在决策范围里面枚举时间复杂度就优化到\(O(n^2)\).

习题:

\(\mathrm{BZOJ}4709\) 柠檬

\(\mathrm{CF868F\ Yet\ Another\ Minimization\ Problem}\)

\(\mathrm{CF321E\ Ciel\ and\ Gondolas}\)

任务安排\(4\)



推荐阅读
  • 一个转子曲线面积问题及其反问题的解答
    曾经解答过这样一个问题,从该ID的最后一次登录时间、该ID显示的专业信息,误以为是新闻里某个想不开的同学,不安了一阵子。经确认是我多虑了,不过把问题答案还是写出来。之后就收到一堆要求帮忙算 ... [详细]
  • Java 中的控制流与作用域
    本文详细介绍了 Java 中的控制流语句,包括块作用域、if 语句、for 循环、while 循环、do-while 循环、switch 语句以及 break 和 continue 语句的使用方法。通过具体的代码示例,帮助读者更好地理解和应用这些控制流结构。 ... [详细]
  • 本文详细介绍了Dijkstra算法,该算法用于解决图中从单个源点到其他所有顶点的最短路径问题。 ... [详细]
  • YOLO由24层ConvNet和2层FCs组成。其核心思想是将图片均匀划分为多个gridcell,每个gridcell产生两个bbox和gridcell中如果存在对象,对象是各类的 ... [详细]
  • 题目描述了麦森数的相关背景和计算方法。麦森数是指形如2^p-1的素数,其中p也是一个素数。尽管p是素数时,2^p-1不一定是素数,但已知的麦森数在数学和计算机科学中有着重要的应用。 ... [详细]
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 最近遇到了一道关于哈夫曼树的编程题目,需要在下午之前完成。题目要求设计一个哈夫曼编码和解码系统,能够反复显示和处理多个项目,直到用户选择退出。希望各位大神能够提供帮助。 ... [详细]
  • LeetCode 实战:寻找三数之和为零的组合
    给定一个包含 n 个整数的数组,判断该数组中是否存在三个元素 a、b、c,使得 a + b + c = 0。找出所有满足条件且不重复的三元组。 ... [详细]
  • java解析json转Map前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:1、单节点单层级、单节点多层级json转mapim ... [详细]
  • 前言:在攻读硕士学位期间,了解期刊的相关知识是非常重要的。本文将对国内外期刊进行简要介绍,并提供一些实用的参考资源。 ... [详细]
  • CentOS 7 中忘记 root 密码时的重置方法
    本文介绍了在 CentOS 7 环境下忘记 root 密码时如何重置密码的详细步骤。不同版本的 Linux 可能存在一定的差异,但本文提供的方法适用于大多数 CentOS 7 系统。 ... [详细]
  • 本文整理了关于Sia去中心化存储平台的重要网址和资源,旨在为研究者和用户提供全面的信息支持。 ... [详细]
  • Vue 中实现动态增删表单区域
    本文介绍如何在 Vue 项目中通过按钮实现表单区域的动态添加和删除功能。 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom"echarts";4、如果用到map(地图),还 ... [详细]
  • 本文探讨了 TypeScript 中泛型的重要性和应用场景,通过多个实例详细解析了泛型如何提升代码的复用性和类型安全性。 ... [详细]
author-avatar
七夜绅士
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有