dp深入与进阶(2):特殊的dp优化:斜率优化(无例题解析版)
斜率优化
应用范围: 这类递推方程式的时间优化
前置推导:
对于
其中满足
单调递增 假设一值
在 中的作用优于 则有:
可得到:
在平面直角坐标系中 令
, 则
显然可知
时,始终满足 的函数值优于
从而得到结论:
对于坐标系中横坐标单调递增的
和 当
时 优于 反之,有
优于
定理雏形证明:
重要定理:对于三个点 A, B, C,假设横坐标递增,且
证明:(不考虑
) 为了方便叙述,令
初始图:
1.假设
如图,有
2.假设
如图有
且 3.假设
如图有
可以发现:无论何种情况,
点一直不是最优的点,所以 过程中可以不考虑 点
由此得证
从几何意义上看:如果在建好的的坐标系中发现“上凸包”(“凸包”如上图所示),则凸包的顶点一定不是最优点
斜率优化的定义:
显然,一个没有上凸包的图
所以优化时可以维护一个单调递减的队列来实现
05.一种可行的代码写法
// 计算两点之间的斜率 int slope(int j, int k) { int x = (f[j] - f[k] + s[j] * s[j] - s[k] * s[k]) / (s[j] + s[k]); return x; } for (int i = 1; i <= n; i++) { while (L < R && slope(q[L], q[L + 1]) <= s[i]) L++; // 维护下凸包 dp[i] = dp[q[L]] + (s[i] - s[q[L]]) * (s[i] - s[q[L]]) + m; // 更新dp值 while (L < R && slope(q[R - 1], q[R]) > slope(q[R], i)) R--; // 剔除无效点 q[++R] = i; // 将当前点加入队列 }
最后扔两道例题在这里,下一篇文章或下下篇文章会进行进一步解析
例
例
本文作者:SamXia
本文链接:https://www.cnblogs.com/SamXia/p/18691907
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
标签:
,
,
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步