ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

浅谈斜率优化dp

2019-10-27 18:00:31  阅读:322  来源: 互联网

标签:浅谈 k2 sumt 斜率 k1 sumc 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有