当前位置: 首页 > news >正文

斜率优化

解决的问题

斜率优化 DP 可以优化以下形式的转移方程:

\[f_i=\max/\min\{a(i)\times X(j)+c(i)+Y(j)+L\} \]

其中 \(a(i),c(i)\) 表示与 \(i\) 有关的函数,\(X(j),Y(j)\) 表示与 \(j\) 有关的函数,\(L\) 代表一个常量。

在上面的式子中,如果 \(a(i)\times X(j)\) 不存在那么就是单调队列或者线段树优化,其余的东西的存在与否并不重要。

解决办法

考虑如果存在 \(j1,j2\),满足 \(j1<j2\)\(j1\) 劣于 \(j2\)(默认取 \(\min\),也就是 \(F(j1)>F(f2)\),如果是 \(\max\) 反过来就行了)。

就有:

\[a(i)\times X(j1)+c(i)+Y(j1)+L>a(i)\times X(j2)+c(i)+Y(j2)+L \]

化简得到:

\[a(i)\times X(j1)+Y(j1)>a(i)\times X(j2)+Y(j2) \]

发现上面这个东西和 \(y=kx+b\) 的一次函数很像,那么令 \(k_0=a(i)\) 就有:

\[k_0\times X(j1)+Y(j1)>k_0\times X(j2)+Y(j2) \]

移项,然后提取公因式:

\[k_0\times (X(j1)-X(j2))>Y(j2)-Y(j1) \]

不妨设 \(X(j2)>X(j1)\),注意用的时候不等号的方向,那么同除得到:

\[-k_0>\dfrac{Y(j2)-Y(j1)}{X(j2)-X(j1)} \]

总结一下,也就是如果上面的式子成立,那么 \(j2\)\(j1\) 优秀。

如果令 \(k_0\gets -k_0\) 那么就和求斜率的式子一模一样了,考虑把 \(X,Y\) 搬到直角坐标系里。

下面只考虑不等式是 \(>\) 的情况。

假设三个决策点分别是 \(A,B,C\)\(AB\) 的斜率是 \(k1\)\(BC\) 的斜率是 \(k2\)

  • 如果 \(k_0>k_1\),那么 \(B\)\(A\) 优。
  • 如果 \(k_0>k_2\),那么 \(C\)\(B\) 优。
  • 显然根据图像有 \(k1>k2\),也就是 \(B\) 是一个上凸。

有三种情况:

  • \(k_0>k_1\wedge k_0>k_2\),那么 \(C\) 优于 \(B,A\)
  • \(k_1>k_0\wedge k_0>k_2\),那么 \(A,C\) 优于 \(B\)
  • \(k_1>k_0\wedge k_2>k_0\),那么 \(A\) 优于 \(B,C\)

根据上面的分析,得到结论上凸永远都不可能是最优点。

把上凸全部删除之后得到的肯定是一个下凸,也就是这样的东西:

假设下图中的红线是 \(k_0\),那么肉眼可与看出第 \(5\) 个决策点是最优秀的。

因为 \(5\) 要节点之后的 \(k\) 都大于 \(k_0\),前面的都小于 \(k_0\)

所以说 \(5\) 就是第 \(1\) 个比 \(k_0\) 的斜率大的连线的靠前的决策点。

发现因为是下凸,所以有单调性可以二分。

如果有 \(m\) 个决策点,那么这样二分:

double slope(int i,int j){if(X(j)==X(i)) return Y(j)>=Y(i)?inf:-inf;return 1.0*(Y(j)-Y(i))/(X(j)-X(i));
}
int F(int k0){int l=1,r=top-1,p=inf;while(l<=r){int mid=(l+r)/2;if(slope(mid,mid+1)<k0) l=mid+1,p=mid;else r=mid-1;}if(p==inf) return s[1];return s[p+1];
}

总结

如果是(取 \(\min\)\(X\) 单调递增)或者(取 \(\max\)\(X\) 单调递减)那么维护下凸。

否则,维护上凸。

注意事项

  1. 尽量避免使用除法,避免精度误差。
  2. 注意一些情况需要向凸包内加入如 \(\{0,0\}\) 这样的初始值。
  3. 注意可能 \(X\) 的值一样,需要加一个 \(mdf\) 来扰动以下。
  4. 在把式子整理的时候 \(c(i)+L\) 其实就是和 \(j\) 无关的东西,不一定要分开。
  5. 注意是否要保留这样的斜率一样的情况:

补充

对于 \(X\) 不单调的情况,我们就不能进行直接移项,考虑进行一些奇技淫巧进行调整。

我们考虑分治,先处理左区间,然后再用左区间得到的结果处理右区间。

具体的,把左右区间分别递归完之后再归并排序即可。

整体来说就是一个 CDQ 分治,另外也可以使用李超线段树。

http://www.hskmm.com/?act=detail&tid=18022

相关文章:

  • AI智能体:从认知到实践
  • Kinect屏幕边缘检测不灵敏的解决方案
  • 暴力拓客游戏小程序:助力商家高效引流与裂变的智能解决方案
  • vue3小坑之-为什么把ref定义的数组赋值给数组对象后取值为空数组?
  • 第二类斯特林数
  • 群论
  • 扫码签到赢大奖小程序:助力多场景获客的智能营销工具
  • docker 镜像/容器
  • jmeter命令行参数详细解释
  • RK3399:性能与能效的嵌入式先锋,解锁多场景应用潜力
  • 【C++STL详解】带头双向循环结构 + 双向迭代器,核心接口 + 排序效率 + 避坑指南 - 教程
  • TorchV知识库安全解决方案:基于智能环境感知的动态权限控制
  • VBA ETH功能应用 | “0”代码构建SOME/IP节点
  • ISUP协议视频平台EasyCVR在智慧灯杆综合管理中的应用
  • 视觉智能赋能产业数智化升级:JBoltAI多模态技术落地实践
  • 神秘考试题
  • 华三交换机升级版本步骤
  • Solon v3.4.6, v3.5.4, v3.6.0-M1 发布。正式开始 LTS 计划
  • 串口通信、阻塞与非阻塞、qt
  • 破解 Java 系统 AI 化难题:JBoltAI 框架自带 RAG、Function Calling 核心功能
  • 算法第一章作业
  • CF1706E Qpwoeirut and Vertices
  • 聚焦 Java AI 开发:JBoltAI 框架支持多模型适配,打造智能应用
  • 企业级 AI 应用开发首选!JBoltAI 框架适配 Java 技术栈,稳定可靠
  • 别等碳超支才慌!EMS 像 “碳导航”,提前预警能耗 “堵点”,双碳路上不绕路
  • OTA测试实战指南:测试流程、用例设计与自动化实现
  • Halcon图像——相机图像采集模式
  • How to use SQL Server Management Studio track one store procedure performance - 详解
  • 【2025-09-25】连岳摘抄
  • 完整教程:探索 Event 框架实战指南:微服务系统中的事件驱动通信: