dp - 斜率优化笔记
(原来的题解没得了,只好重写一份)
斜率优化一般是, 是枚举一个 ,然后前面找一个 ,式子中有些和 有关,有些和 有关,有些和俩都有关。
过程中,我们维护一个单调队列,它们可能作为最优的转移位置。其中队首是最优的,其它的是 可能 成为最优的(现在不是,可能以后)
核心步骤:把每个决策转化成平面直角坐标系上的点,然后从几何的角度考虑哪些点可能是最优的,哪些不可能。
我们发现这个性质好像很妙。所以说,不是所有题都可以斜率优化的。
这些说的肯定非常迷惑,看个实际的
示例
最经典的入门题 HNOI2008玩具装箱
转移方程为 ,非常 simple
我们令和 有关的为 ,和 有关的为
那
拆开
假设 是最优的那个转移,那
这个式子里面,注意到 这一项是同时与俩有关的。
主体思想
我们把和 有关的那个 看成斜率,和 有关的 看成 。那 肯定也要和 有关,移到右边。我们的主体思想是把 变成一个截距。所以把 和一些只和 有关的东西放到左边。
(这一步就体现出“斜率”了)
变成 。其中 ,。
令 作为第 个决策点,坐标为 。
那现在问题转化成了:找到一个 ,使得过点 的斜率为 (定值)的直线的截距加上 (定值)最小。
手画几张图可以得出以下结论:
- 如果队首的斜率 ,那这一次转移队首就比队首的下一个要劣(画图发现);而且 是单增的,那以后肯定都劣,直接弹队首
- 斜率应该是单调递增的 (这个要手画了)。所以如果新来的和原队尾组成的斜率,小于原队尾和原队尾上一个的斜率,那这个队尾就废了
然后就维护一个单调队列就完事了。复杂度是 的, 都不带。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】