关于dp斜率优化的一些感悟

本文深入探讨了DP斜率优化的基础应用,特别是在1D1D型DP问题中,如HNOI2008玩具装箱问题。文章详细解析了如何通过斜率公式和队列维护,实现类似凸包图形的优化,以及如何利用二分法找到临界点,从而在O(n)的时间复杂度内解决此类问题。同时,文章还讨论了决策单调性和四边形不等式的概念,强调了这些原理在确保斜率优化有效性的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习链接

感悟:
dp的斜率优化的基础用法是在1D1D型的dp上,如HNOI2008玩具装箱,这里是 d p [ i ] = min ⁡ d p [ j ] + ( s [ i ] − s [ j ] − L ) 2 dp[i]=\min{dp[j]+(s[i]-s[j]-L)^2} dp[i]=mindp[j]+(s[i]s[j]L)2

这里假设一个 j 1 < j 2 j_1<j_2 j1<j2且满足 j 1 j_1 j1的答案没有 j 2 j_2 j2的优,那么可以推得一个斜率dp的公式:
在这里插入图片描述
这里我们可以将 Y ( j ) = d p [ j ] + ( S [ j ] + L ) 2 Y(j)=dp[j]+(S[j]+L)^2 Y(j)=dp[j]+(S[j]+L)2 X ( j ) = S [ j ] ) X(j)=S[j]) X(j)=S[j])
于是就可以得到一个斜率的式子 Y ( j 2 ) − Y ( j 1 ) / X ( j 2 ) − X ( j 1 ) Y(j_2)-Y(j_1)/X(j_2)-X(j_1) Y(j2)Y(j1)/X(j2)X(j1)
这里可以用一个队列来维护,得到一个类似的凸包的图形。
j 1 < j 2 < j 3 j_1<j_2<j_3 j1<j2<j3,像维护凸包一样,当 s l o p e ( j 1 , j 2 ) > s l o p e ( j 1 , j 3 ) slope(j_1,j_2)>slope(j_1,j_3) slope(j1,j2)>slope(j1,j3)可以将 j 2 j_2 j2删除掉。
(这个需要满足单调性原理,可以看博客中的tournament那道题)
然后用二分的办法找到临界点 p p p,满足 i < p i<p i<p都是满足 2 ∗ s [ i ] > = s l o p e ( i − 1 , i ) 2*s[i]>=slope(i-1,i) 2s[i]>=slope(i1,i) i > p i>p i>p都是 2 ∗ s [ i ] < s l o p e ( i , i + 1 ) 2*s[i]<slope(i,i+1) 2s[i]<slope(i,i+1),这样 p p p就是当前的最优解;
而这道题满足一个性质–四边形不等式;
d p [ i ] = d p [ j ] + w ( i , j ) dp[i]=dp[j]+w(i,j) dp[i]=dp[j]+w(i,j)时,对 w ( i , j ) w(i,j) w(i,j)如果满足 w ( i , j ) + w ( i + 1 , j + 1 ) < = w ( i + 1 , j ) + w ( i , j + 1 ) w(i,j)+w(i+1,j+1)<=w(i+1,j)+w(i,j+1) w(i,j)+w(i+1,j+1)<=w(i+1,j)+w(i,j+1),那么最优解对应的点就会是单调增加的,即决策单调性;
这样就可以只维护凸包的 i > p i>p i>p部分,前面可以直接排除掉,用个队列就可以 O ( n ) O(n) O(n)解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值