DP优化 - 斜率优化

news2024/10/2 10:40:15

假设当前的 DP 方程为

f i = min ⁡ 0 ≤ j < i { − K ( i ) X ( j ) + Y ( j ) } + F ( i ) f_i=\min\limits_{0\leq j< i}\{-K(i)X(j)+Y(j)\} + F(i) fi=0j<imin{K(i)X(j)+Y(j)}+F(i)

f i = max ⁡ 0 ≤ j < i { − K ( i ) X ( j ) + Y ( j ) } + F ( i ) f_i=\max\limits_{0\leq j< i}\{-K(i)X(j)+Y(j)\} + F(i) fi=0j<imax{K(i)X(j)+Y(j)}+F(i)

其中 F ( i ) F(i) F(i) K ( i ) K(i) K(i) 为关于 i i i 的函数, X ( j ) X(j) X(j) Y ( j ) Y(j) Y(j) 为关于 j j j 的函数。( X ( j ) X(j) X(j) Y ( j ) Y(j) Y(j) 中可以包含 f j f_j fj

接下来只考虑 f i = min ⁡ 0 ≤ j < i { − K ( i ) X ( j ) + Y ( j ) } + F ( i ) f_i=\min\limits_{0\leq j< i}\{-K(i)X(j)+Y(j)\} + F(i) fi=0j<imin{K(i)X(j)+Y(j)}+F(i) 的情况,因为另一个与这个相似。

此时,我们设 B ( i ) B(i) B(i) f i − F ( i ) f_i - F(i) fiF(i)。方程就成为

B ( i ) = min ⁡ 0 ≤ j < i { − K ( i ) X ( j ) + Y ( j ) } B(i)=\min\limits_{0\leq j< i}\{-K(i)X(j)+Y(j)\} B(i)=0j<imin{K(i)X(j)+Y(j)}

对于一个一次方程 y = k x + b y=kx+b y=kx+b,其可以转换为 b = y − k x b=y-kx b=ykx

所以说,原方程相当于求过所有满足 0 ≤ j < i 0\leq j < i 0j<i 的点 ( X ( j ) , Y ( j ) ) (X(j), Y(j)) (X(j),Y(j)) 的、斜率为 K ( i ) K(i) K(i) 的一次方程在 y y y 轴的截距 b b b 的最小值 B ( i ) B(i) B(i)

假设有一条直线 y = K ( i ) x + b y=K(i)x+b y=K(i)x+b,从 b = − ∞ b=-\infty b= 开始,不断上移,直到碰到第一个碰到的点 ( X ( j ) , Y ( j ) ) (X(j),Y(j)) (X(j),Y(j)),答案 B ( i ) = b B(i) = b B(i)=b

这个问题可以使用凸包解决。

即求出所有满足 0 ≤ j < i 0\leq j < i 0j<i 的点 ( X ( j ) , Y ( j ) ) (X(j), Y(j)) (X(j),Y(j)) 组成的凸包,

在这里插入图片描述
(图片引用至 OI - WIKI)

然后求出凸包上斜率为 K ( i ) K(i) K(i) 的直线的切点。

我们可以用平衡树,二分, C D Q CDQ CDQ 等方法求出切点。

平衡树时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn) C D Q CDQ CDQ 时间复杂度 O ( n log ⁡ 2 n ) O(n\log^2 n) O(nlog2n),二分 O ( n log ⁡ n ) O(n\log n) O(nlogn)

如果函数 K ( i ) K(i) K(i) 满足单调性,则可以用单调队列解决,之后假设 K ( i ) K(i) K(i) 单调递增。(单调递减则类似)

单调队列储存了凸包上的一些节点 P 0 , P 1 , P 2 , . . . P_0, P_1,P_2,... P0,P1,P2,...

若当前斜率改变为 K ( i ) K(i) K(i),我们每次判断单调队列中前两个点 P 0 , P 1 P_0,P_1 P0,P1 组成线段的斜率是否小于 K ( i ) K(i) K(i)。若小于,则删除 P 0 P_0 P0,重复刚才的步骤。反之,切点为 P 0 P_0 P0

求出切点后,我们对应可以求出 B ( i ) B(i) B(i),也可以求出 f i f_i fi

然后在图中添加点 ( X ( i ) , Y ( i ) ) (X(i),Y(i)) (X(i),Y(i)),往下计算 f i + 1 f_{i+1} fi+1

维护一个动态凸包即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/337948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Node.js笔记-Express(基于Node.js的web开发框架)

目录 Express概述 Express安装 基本使用 创建服务器 编写请求接口 接收请求参数 获取路径参数(/login/2) 静态资源托管-express.static&#xff08;内置中间件&#xff09; 什么是静态资源托管&#xff1f; express.static() 应用举例 托管多个静态资源 挂载路径前缀…

车厢调度(train)(栈)

目录 题目描述 解题思路&#xff1a; 代码部分&#xff1a; 题目描述 有一个火车站&#xff0c;铁路如图所示&#xff0c;每辆火车从A驶入&#xff0c;再从B方向驶出&#xff0c;同时它的车厢可以重新组合。假设从A方向驶来的火车有n节&#xff08;n≤1000&#xff09;&…

Revit中关于屋顶编辑线移动的问题

一、Revit中关于屋顶编辑线移动的问题 在绘制屋顶的时候&#xff0c;如果出现有稍微偏差的时候&#xff0c;个别习惯移动编辑线&#xff0c;这种方法是不可取的&#xff0c;接下来为大家介绍一下这种方法的问题所在。 首先我们绘制几面这样的墙体&#xff0c;主要做测试用的&am…

锁升级之Synchronized

Synchronized JVM系统锁一个对象里如果有多个synchronized方法&#xff0c;同一时刻&#xff0c;只要有一个线程去调用其中的一个synchronized方法&#xff0c;其他线程只能等待&#xff01;锁的是当前对象&#xff0c;对象被锁定后&#xff0c;其他线程都不能访问当前对象的其…

流程引擎之发展史及对比总结

流程引擎渊源市场上比较有名的开源流程引擎有 jBPM、Activiti、Camunda、Flowable 和 Compileflow。其中 jBPM、Activiti、Flowable、camunda 四个框架同宗同源&#xff0c;祖先都是 jbpm4&#xff0c;开发者只要用过其中一个框架&#xff0c;基本上就会用其它三个。而 Compile…

SOFA Weekly|SOFANew、本周贡献 issue 精选

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展欢迎留言互动&#xff5e;SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&#…

基于Gromacs配体修饰自由能FPE计算(手动版)

基于Gromacs配体修饰自由能FPE计算(手动版) 本教程来自于https://github.com/huichenggong/Learning-Computation-with-Chenggong/tree/main/CC_news_008_ddG_uniFEP 我们将要使用的系统来自这篇论文 配体和受体pdb文件 A. 介绍 在本教程中&#xff0c;我们将使用非平衡自…

使用开源实时监控系统 HertzBeat 5分钟搞定 Mysql 数据库监控告警

使用开源实时监控系统 HertzBeat 对 Mysql 数据库监控告警实践&#xff0c;5分钟搞定&#xff01; Mysql 数据库介绍 MySQL是一个开源关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL 是最流行的开源关系型数据库管理系统之…

VHDL语言基础-时序逻辑电路-锁存器

目录 锁存器的设计&#xff1a; RS锁存器&#xff1a; 真值表&#xff1a; 电路结构图&#xff1a; RS锁存器的仿真波形如下&#xff1a; D锁存器&#xff1a; D锁存器的仿真波形如下&#xff1a; 锁存器的设计&#xff1a; 为了与触发器相类比&#xff0c;我们先介绍锁…

奇舞周刊第 481 期 数据不够实时:试试长连接?

记得点击文章末尾的“ 阅读原文 ”查看哟~下面先一起看下本期周刊 摘要 吧~奇舞推荐■ ■ ■数据不够实时&#xff1a;试试长连接&#xff1f;在特定场景下&#xff0c;我们往往需要实时的去获取最新的数据&#xff0c;如获取消息推送或公告、股票大盘、聊天消息、实时的日志和…

面试(九)小米C++开发一面 21.11.02

1、局部变量与全局变量的区别?可以同名嘛? 首先是作用域: 局部变量只在变量声明的代码块范围内生效 全局变量在其声明后的所有位置都能访问到 在局部变量与全局变量同名的情况下,全局变量会被屏蔽掉,只会使用局部变量的内容 2、extern 当在a.c中想要使用b.c中的函数fu…

【Mac OS】JDK 多版本切换配置

前言 由于不同的项目可能需要使用的 JDK 版本不一样&#xff0c;所以在系统中配置多个 JDK 版本&#xff0c;并且能随时切换&#xff0c;是一个必要的配置。 查看已安装的 JDK 版本 /usr/libexec/java_home -V框框1是执行的命令 框框2是当前系统下所有的 JDK 版本 框框3是当…

1.7 Web学生管理系统

1.定义通讯协议基于前面介绍过的 FLask Web 网站 与 urlib 的访问网站的方法&#xff0c;设计一个综合应用实例。它是一个基于 Web 的学生记录管理程序。学生的记录包括 id(学号) 、name(姓名) 、grade(成绩)&#xff0c;服务器的作用是建立与维护一个Sqllite 的学生数据库 stu…

单目相机、双目相机和RGB-D相机学习笔记(一些视频和博文网址)

目录1. 单目相机1.1 摄像头原理1.2 单目相机的标定2 双目相机2.1 双目相机定位原理2.2 双目相机的缺陷3 RGB-D相机3.1 深度相机结构光原理3.2 RGB-D相机的应用1. 单目相机 1.1 摄像头原理 视频网址&#xff1a;【全网最详细】摄像头原理分析&#xff08;约25分钟课程&#xf…

RPC框架设计的安全性考量

RPC里面该如何提升单机资源的利用率&#xff0c;你要记住的关键点就一个&#xff0c;那就是“异步化”。调用方利用异步化机制实现并行调用多个服务&#xff0c;以缩短整个调用时间&#xff1b;而服务提供方则可以利用异步化把业务逻辑放到自定义线程池里面去执行&#xff0c;以…

springboot 注解

上一篇&#xff1a;初识springboot接收参数常用注解RequestBody 常用于POST表单提交参数接收RequestMapping("/test") public String test(RequestBody String data){return data; }PathVariable 获取路径上的参数&#xff1a;/test/{id} RequestMapping("/test…

开源流程引擎Camunda

开源流程引擎Camunda 文章作者&#xff1a;智星 1.简介 Camunda是一个轻量级的商业流程开源平台&#xff0c;是一种基于Java的框架&#xff0c;持久层采用Mybatis&#xff0c;可以内嵌集成到Java应用、SpringBooot应用中&#xff0c;也可以独立运行&#xff0c;其支持BPMN&a…

ThingsBoard-规则引擎介绍

1、什么是规则引擎? 规则引擎是一个易于使用的框架,用于构建基于事件的工作流。有3个主要组成部分: 消息- 任何传入事件。它可以是来自设备的传入数据、设备生命周期事件、REST API 事件、RPC 请求等。规则节点- 对传入消息执行的功能。有许多不同的节点类型可以过滤、转换…

微信 API 中调用客服消息接口提示错误返回限制

错误的信息如下&#xff1a;errcode45015, errmsgresponse out of time limit or subscription is canceled rid: 5f8fd8b7-0f8aa1a9-4b6215a5微信的文档看着这微信不清不楚的文档&#xff1a;微信公众平台在这个文档界面中&#xff0c;有句话&#xff1a;这句话&#xff0c;我…

【信息学CSP-J近16年历年真题64题】真题练习与解析 第13题之标题统计

标题统计 描述 凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符? 注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字符数时,空格和换行符不计算在内。 输入 输入文件只有一行,一个字符串 s。 输出 输出文件只有一行,包含一个整…