首页 > 其他分享 >斜率优化dp

斜率优化dp

时间:2024-08-12 20:37:49浏览次数:11  
标签:截距 斜率 就是 优化 转移 dp

次次学次次忘,这次必须记录一下。

斜率优化dp

概念:

对于形如:

\[dp_i=\min/\max (dp_j+a_i\times b_j+c_i+d_j) \]

的dp式子,将复杂度从 \(O(n^2)\) 优化到接近 \(O(n)\) 的优化方式。

注:\(a_i\) 和 \(c_i\) 就是和 \(i\) 有关的变量,\(b_j\) 和 \(d_j\) 就是和 \(j\) 有关的变量。

方法:

斜率优化dp有两种理解和实现的方法,但是殊途同归,最终都是一样的,将式子转化成形如 \(y=kx+b\) 的二元一次方程的形式,之后再利用凸包来优化。

接下来我就用最简单的一个式子作为示例来讲解。

dp示例:

\[dp_i=\min _{j=1}^{i-1}(dp_j - i\times j + i + j) \]

理解方法1:

假设 \(i\) 最优秀的转移方式就是从 \(j\) 转移过来,则:

\[dp_i=dp_j - i\times j + i + j \]

式子可以转化成:

\[( dp_j + j ) = i\times j + ( dp_i - i ) \]

(秘诀就是将只和 \(j\) 有关的量放在一起,只和 \(i\) 相关的变量放在一起)

这就很像一个二元一次方程,我们可以设 \(( dp_j + j )\) 为 \(y\),\(j\) 就是 \(x\),而 \(i\) 就是斜率 \(k\),而剩下的 \((dp_i - i)\) 就是 \(b\)——截距。

那么,我们目标就是得到最小的 \(dp_i\) ,即 \((dp_i - i)\) 最小,即为求一个满足条件的 \(j\),使得最后求出来的方程的截距最小。

那么,我们就可以把问题看成:

在一个平面直接坐标系中每一个dp值都对应着一个点,坐标为 \((\ j , dp_j + j\ )\),对于每一次转移,都是有一个斜率为 \(i\) 的直线,只要有某个点在这条直线上,这次转移就是有效的,我们想要截距最小。

(放个图方便理解)

image

所以我们考虑,怎么样才能快速的找到最优的那个转移点。

可以发现,我们首先想让截距最小,所以这条直线肯定是越往下越好,其次还发现这条线的斜率是固定的(只与 \(i\) 相关)。

那么形象一点考虑就是一条线从下往上去截,直到截到了某个点,那这个点就是答案。

(还是图片更一目了然)

image

这时候可以发现,只有最下面的一圈点会有可能产生贡献,即一定是相邻两点斜率单调且尽可能小。

如图,2号点就肯定不会是最优的用来转移的点,因为 \(k_1>k_2\)。

image

然后,有可能用于转移的点就是 \(4,1,3\)。

这其实就是个下凸包,直接用电调队列维护一个斜率单调的凸包,每次转移直接从凸包上查找,并且一定是从斜率大于 \(k\) 和小于 \(k\) 的线之间的交界的点转移。

注:\(k\) 就是当前转移直线的斜率。

(看图)

image

注:红色的点就是所维护的凸包,蓝色的点就是其它的一定不会产生贡献的点,与红色的点所切的点就是用于转移的点。

标签:截距,斜率,就是,优化,转移,dp
From: https://www.cnblogs.com/Jack-YT/p/18352209

相关文章

  • 状态估计之非线性优化学习
    SLAM的后端优化,一般分为滤波方法与非线性优化方法,其中部分思想重叠,具有很鲜明的对比特性。在前几章中,我们学习了KF系列与PF系列,并对一部分内容进行扩展,这些方法的本质是在一步步过程中进行优化收敛,本篇将引入后端整体优化思想,在建图,轨迹跟踪,系统状态估计中应用广泛。本篇的学习大......
  • NoSQL之Redis配置与优化
    Redis简介Redis(RemoteDictionaryServer,远程字典型)是一个开源的、使用C语言编写的NoSQL数据库。Redis基于内存运行并支持持久化,采用key-value(键值对)的存储形式,是目前分布式架构中不可或缺的一环Redis优点:具有极高的数据读写速度,数据读取的速度最高可达到110000次/......
  • PHP性能优化秘籍:让代码飞起来
    标题:PHP性能优化秘籍:让代码飞起来PHP作为一门广泛使用的服务器端脚本语言,其性能直接影响到Web应用的响应速度和用户体验。本文将深入探讨PHP性能优化的多种技巧,从代码层面到服务器配置,帮助你的PHP应用达到最佳性能。我们将通过一系列详细的优化策略和实际代码示例,展示如何......
  • Scrapy框架进阶攻略:代理设置、请求优化及链家网实战项目全解析
    scrapy框架加代理付费代理IP池middlewares.py#代理IP池classProxyMiddleware(object):proxypool_url='http://127.0.0.1:5555/random'logger=logging.getLogger('middlewares.proxy')asyncdefprocess_request(self,request,spider):......
  • 猜数字完全体?还能优化不?
    1>> 前言     首先感谢大家对之前文章的喜欢,你们的三连是我持续更新的动力!    继续采纳大佬们的意见,今天将以代码的形式,逐步剖析来进行分享和交流经验,希望能得到大家的喜欢。接下来和我一起步入C语言世界吧!注:以下代码是C语言,但CSDN好像选不了,只有C++也可能......
  • JVM参数详解:优化应用程序性能的关键
    Java虚拟机(JVM)是Java程序的运行环境,它负责将Java字节码转换为机器码,并在实际计算机上执行。为了优化应用程序的性能,我们需要了解JVM的参数设置。本文将详细介绍JVM的常见参数及其作用,帮助您更好地理解和配置JVM。JVM参数分类JVM参数分为两大类:启动参数和系统属性。1.启......
  • linux反向代理原理:帮助用户更好地优化网络架构
    Linux反向代理原理详解反向代理是一种在网络架构中常用的技术,尤其在Linux环境下被广泛应用。它可以帮助实现负载均衡、安全防护和请求缓存等功能。本文将深入探讨Linux反向代理的原理、工作机制以及其应用场景。1.什么是反向代理反向代理是指代理服务器接收客户端的请求,......
  • 打造高效存储与访问体验:NFS共享携手Nginx负载均衡,赋能企业级数据流通与性能优化
     作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭:   云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团团-CSDN博客前言:随着业务的增长,公司需要更多的服务器来支持用户访问和应用程序的运行。NFS共享可以解决文件存储的问题,而n......
  • Profibus DP主站转Modbus RTU协议网关(通讯配置详解)
    作者的许多朋友均对如何实现ProfibusDP网络和ModbusRTU网络的连接互通感到十分困扰,现在为大家统一作出解释。事实上,远创智控YC-DPM-RTU此款设备能够完美地解决这一问题。接下来,作者将会给各位全面且详尽地阐述该设备的功能、参数以及配置的方法。一,产品主要功能远创智控YC-......
  • Profibus DP(主站)转EtherNet/IP协议转换网关(通讯配置详解)
    作者的许多朋友均对如何实现ProfibusDP网络和EtherNet/IP网络的连接互通感到十分困扰,现在为大家统一作出解释。事实上,远创智控YC-DPM-EIP此款设备能够完美地解决这一问题。接下来,作者将会给各位全面且详尽地阐述该设备的功能、参数以及配置的方法。产品介绍本产品实现PROFIB......