首页 > 其他分享 >dp优化-决策单调性 / 四边形不等式

dp优化-决策单调性 / 四边形不等式

时间:2024-01-11 15:23:23浏览次数:27  
标签:二分 le 不等式 决策 dp 四边形 单调

前言

这种优化我以前“听”过了很多次,但是好像都没学会qwq。

四边形不等式:

对于二元组 \(w_{x,y}\),如果在定义域上任取四个点 \(a \le b \le c \le d\),满足:

\[w_{a,b}+w_{c,d} \ge w_{a,c}+w_{b,d} \]

则称 \(w_{x,y}\) 满足四边形不等式。

你会想这鬼东西怎么记?反正我也不想记。

所以也有一个 等价转换

对于对于二元组 \(w_{x,y}\),如果在定义域上任取四个点 \(i,j\),满足:

\[w_{i,j} + w_{i+1,j+1} \le w_{i+1,j}+w_{i,j+1} \]

则称 \(w_{x,y}\) 满足四边形不等式。

这东西好记多了,至于怎么证的,我也懒得说qwq。

决策单调性

假设我有一种 dp:

\[f_i = \min_{j=1}^{i} f_{j-1} + w_{j,i}\\ \]

这个显然是 \(O(n^2)\),考虑怎么优化。
有一个很高妙的性质就是:若 \(w_{x,y}\) 满足四边形不等式,则 \(f_i\) 满足决策单调性。

具体的,令 \(g_i\) 表示 \(f_i\) 的最优决策,则 \(g_i\) 单调不降。

有了这个性质就很好优化到 \(O(nlogn)\),但是怎么写也是一大研究。

二分栈——决策单调性:

二分栈顾名思义是:二分的栈(这不废话?)。

考虑在扫描 \(i\) 的时候动态维护 \(g_i\),不妨设我们已经处理完 \(f\) 前 \(k-1\) 的值,那么就有两部:

  1. 有 \(g_k\) 更新 \(f_k\),那么 \(f_k\) 就计算好了。
  2. 考虑 \(f_k\) 对后面的贡献,由于决策单调,所以在只计算 \(f\) 的前 \(k\) 个值的时候,\(f_k\) 一定是一段后缀,然后把这段后缀 \(g_i = k\) 即可。

例如,\(k=3\) 时,也许 \(g\) 数组的变化是:\(001112222 -> 001133333\)。

具体怎么找这个后缀的起点 \(x\),是具有可二分性的,也许能得到一个 \(O(nlogn)\) 的线段树做法。

但是这样就不妙了,如果题目稍有转换,线段树写起来就不好写。

事实上,我们可以考虑用栈维护颜色连续段 \((l,r,k)\) 表示 \(k\) 这个点目前是 \(l\) 到 \(r\) 这个区间的决策点。

然后从后缀开始,暴力的检测这一个连续段是否被覆盖(就比如上面的例子,2的连续段就被3完全覆盖),如果被覆盖就弹栈。

最后还有一小段,就是一部分被新的所覆盖,一部分我自己还是决策点(就比如,1的连续段就被占据了一丢丢),那么这个分界点肯定也是有二分性的,所以直接二分就可以得到这个临界点,然后就稍微修改一下这一部分的覆盖范围,再插入新的连续段到栈顶即可。

这样就做到常数小的 \(O(nlogn)\)。

标签:二分,le,不等式,决策,dp,四边形,单调
From: https://www.cnblogs.com/wangzhongyuan/p/17958651

相关文章

  • 全网最详细的线程池 ThreadPoolExecutor 详解,建议收藏!
    一、ThreadPoolExecutor类讲解1、线程池状态:五种状态:线程池的shutdown()方法,将线程池由RUNNING(运行状态)转换为SHUTDOWN状态线程池的shutdownNow()方法,将线程池由RUNNING或SHUTDOWN状态转换为STOP状态。注:SHUTDOWN状态和STOP状态先会转变为TIDYING状态,最终......
  • SiteGround如何设置WordPress网站自动更新
    SiteGroundAutoupdate功能会自动帮我们更新在他们这里托管的所有WordPress网站,这样做是为了保证网站安全,并且让它们一直保持最新状态。他们会根据我们选择的设置自动更新不同版本的WordPress,包括主要版本和次要版本。在每次自动更新之前,他们都会为我们的网站做一个完整的备份,这样......
  • 使用 WordPress搭建个人博客
    安装LNMP下载LNMP:wgethttp://soft.vpser.net/lnmp/lnmp2.0.tar.gz-cOlnmp2.0.tar.gz解压并执行:tarzxflnmp2.0.tar.gz&&cdlnmp1.5&&./install.shlnmp选择想要安装的版本然后回车开始安装时间比较长,耐心等待一下,看到以下显示表示安装成功配置nigix查看nginx配置文......
  • 使用VBScript清理%AppData%\Microsoft\InputMethod\Chs下的UDP*.tmp文件
    目录代码使用方法话题来源彩蛋——Windows操作系统下到底有多少种脚本语言?代码'VBScripttolistUDP*.tmpfilesandaskuserfordeletionOptionExplicit'DeclarevariablesDimWSHShell,FSO,TargetFolder,FileCollection,FileDimTargetPattern,FilesToDelete,Fi......
  • DPDK测试testpmd
    前言参考https://www.cnblogs.com/hjxiamen/p/17758112.html在Ubuntu20.04上安装DPDK20.11.9。一、testpmd是什么?在DPDK(DataPlaneDevelopmentKit)中,testpmd是一个用于测试和评估DPDK网络功能的命令行实用程序。testpmd提供了一个交互式的环境,使用户能够配置、启......
  • 技术大拿私房课:掌握Task、Thread、ThreadPool的终极秘籍!
    大家好,我是小米!在这个充满技术和创新的时代,作为一名喜欢分享的技术探索者,我想和大家聊一聊一些在社招面试中常常被提到的热门话题——task、thread、threadpool。这是一组关于并发编程的核心问题,也是我们在日常工作中不可避免要面对的挑战。Task是什么?首先,让我们从Task开始说起。在......
  • DockerCompose中重启某个服务时提示: (iptables failed: iptables --wait -t nat -A D
    场景DockerCompose修改某个服务的配置(添加或编辑端口号映射)后如何重启单个服务使其生效:DockerCompose修改某个服务的配置(添加或编辑端口号映射)后如何重启单个服务使其生效_docker-compose修改端口映射基于docker-compose的方式,如果只是要单纯的重启某个服务,则可以通过docker-c......
  • Python 安装达梦数据库的问题怎么弄 DPI ?
    如果您想在Python中安装并使用达梦数据库,请按照以下步骤进行:安装DPI(达梦Python接口):您需要首先安装DPI,它是Python与达梦数据库之间的驱动程序。您可以从达梦官方网站下载并安装适用于您的操作系统的DPI。安装Python的数据库接口模块:在Python中使用达梦数据库,您需要安装相应的数据......
  • WordPress主题警告:侧边栏字符串偏移非法
    "侧边栏字符串偏移非法"警告通常是由于在WordPress主题的侧边栏中使用了不正确的代码或字符引起的。这可能是一个语法错误、字符编码问题或标签的闭合问题。要解决这个问题,可以尝试以下几个步骤:1.检查语法错误:打开你的WordPress主题文件,找到侧边栏的相关代码,并确保没有任何语......
  • 浅谈一类状态转移依赖邻项的排列计数问题 - 连续段 dp
    UPD2023.12.31:失手把原来的博文删掉了,这篇是补档。引入在一类序列计数问题中,状态转移的过程可能与相邻的已插入元素的具体信息相关(e.g.插入一个新元素时,需要知道与其插入位置相邻的两个元素的值是多少,才可进行状态转移,如「JOIOpen2016」摩天大楼)。这类问题通常的特点是,如......