欢迎来到SamXia的博客|

SamXia

园龄:1个月粉丝:1关注:2

2025-01-26 16:01阅读: 43评论: 0推荐: 1

dp深入与进阶(2):特殊的dp优化:斜率优化(无例题解析版)

斜率优化

01.应用范围:fi=min/max(ai×bj+ci+dj)这类递推方程式的时间优化

02.前置推导:

对于fi=minj(ai×bj+ci+dj)

其中满足b单调递增

假设一值j1dp中的作用优于j2

则有:

ai×bj2+dj2ai×bj1+dj1

可得到:

ai(dj1)(dj2)bj1bj2

在平面直角坐标系中 令xj=bjyj=dj

k(j1,j2)=(dj1)(dj2)bj1bj2

显然可知aik(j1,j2)时,始终满足j1的函数值优于j2

从而得到结论:

对于坐标系中横坐标单调递增的j1j2

aik(j1,j2),f(j1) 优于 f(j2)

反之,有f(j2) 优于 f(j1)

03.定理雏形证明:

重要定理:对于三个点 A, B, C,假设横坐标递增,且k(A,B)>k(B,C),可以证明:B的函数值一定不最优

证明:(不考虑a=k)

为了方便叙述,令k1=k(A,B),k2=k(B,C)

初始图:

1.假设a<k2<k1:

如图,有f(A)>f(B)>f(C)

2.假设k2<a<k1:

如图有f(A)>f(B)f(C)>f(B)

3.假设k2<k1<a:

如图有f(C)>f(B)>f(A)

可以发现:无论何种情况,B点一直不是最优的点,所以dp过程中可以不考虑B

由此得证

从几何意义上看:如果在建好的的坐标系中发现“上凸包”(“凸包”如上图所示),则凸包的顶点一定不是最优点

04. 斜率优化的定义:

dp中忽略所有“上凸包”,优化时间复杂度的优化办法,这样的优化方法即为斜率优化

显然,一个没有上凸包的图k值一定是单调递减的

所以优化时可以维护一个单调递减的队列来实现

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; // 将当前点加入队列
}

最后扔两道例题在这里,下一篇文章或下下篇文章会进行进一步解析

1:P3195

2:P2900

本文作者:SamXia

本文链接:https://www.cnblogs.com/SamXia/p/18691907

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   SamXia  阅读(43)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起