其他分享
首页 > 其他分享> > 浅谈斜率优化dp

浅谈斜率优化dp

作者:互联网

斜率优化dp的本质还是dp
只是转移耗时太大,我们需要根据其转移方程优化

两种常见的计算斜率的方法:
1.作差比较法
举个例子
当前我们的dp转移方程为:(最后求f[n]f[n]f[n]的最小值)
f[i]=f[j]+(sumt[i]+s)(sumc[i]sumc[j])f[i]=f[j]+(sumt[i]+s)*(sumc[i]-sumc[j])f[i]=f[j]+(sumt[i]+s)∗(sumc[i]−sumc[j])
我们取两个jjj的值,假设为k1,k2(满足k1<k2k1<k2k1<k2)
如果决策k1k1k1比k2k2k2优,那么一定会得到:
f[k1]+(sumt[i]+s)(sumc[i]sumc[k1])<f[k2]+(sumt[i]+s)(sumc[i]sumc[k2])f[k1]+(sumt[i]+s)*(sumc[i]-sumc[k1])<f[k2]+(sumt[i]+s)*(sumc[i]-sumc[k2])f[k1]+(sumt[i]+s)∗(sumc[i]−sumc[k1])<f[k2]+(sumt[i]+s)∗(sumc[i]−sumc[k2])
移项整理可得:
f[k1]f[k2]sumc[k1]sumc[k2]<s+sumt[i]\frac{f[k1]-f[k2]}{sumc[k1]-sumc[k2]}<s+sumt[i]sumc[k1]−sumc[k2]f[k1]−f[k2]​<s+sumt[i]
若将(sumc[k],f[k])(sumc[k],f[k])(sumc[k],f[k])看作点
左边则为两点之间的斜率
所以当斜率K满足K<s+sumt[i]K<s+sumt[i]K<s+sumt[i]时,决策k1更优

知道这个后如何优化dp呢?
我们在添加决策的时候就可以根据斜率进行删减(根据题意维护一个上凸包或下凸包)
而在查找最优决策的时候

2.直接转化法
还是上面的方程
我们换个形式寻找斜率:
将dp方程表示成y=kx+b的形式
其中:
x:只与j有关,且其系数与i有关
y:只与j有关
k:只与i有关,是某个只与j有关的量的系数
b:一般是与当前要求的dp值有关的量(与i有关)
然后(x,y)只与j有关,看做平面上的点,决策可以认为是一条斜率一定的直线。
然后我们需要最大化或最小化b。

最后得到这样的式子:
(s+sumt[i])sumc[j]+f[i]sumt[i]sumc[i]=f[j]+ssumc[n](s+sumt[i])*sumc[j]+f[i]-sumt[i]*sumc[i]=f[j]+s*sumc[n](s+sumt[i])∗sumc[j]+f[i]−sumt[i]∗sumc[i]=f[j]+s∗sumc[n]


为什么这样进行优化是正确的?
假设现在有三个决策点
emm……
不想写了(好冷,手都冻僵了)
大家自己画图,然后分类讨论一下
会发现如果三个点呈上凸状,中间那个点无论在哪种情况下都不会作为最优的决策(针对求最小值的情况)

标签:浅谈,k2,sumt,斜率,k1,sumc,dp
来源: https://blog.csdn.net/weixin_42557561/article/details/102769283