【学习笔记】DP 优化 3:闵可夫斯基和优化 DP

Page Views Count

概述#

用于优化 (max/min,+) 卷积,形如:

fi=maxj=0i/minj=0i{gj+hij}

要求 g,h 具有凸性。

算法流程#

max 为例,要求 g,h 形成上凸包,对 g,h 差分,那么 fi 相当于在 ΔgΔh 中选两个前缀,要求长度和为 i,权值和最大。由于 ΔgΔh 都单调不升,那么归并排序之后选前 i 个数就是最优。

同理 min 要求 g,h 形成下凸包。

vector<int> Minkowski(vector<int> g,vector<int> h){
    vector<int> f;
    for(int i=(int)g.size()-1;i>=1;--i) g[i]-=g[i-1];
    for(int i=(int)h.size()-1;i>=1;--i) h[i]-=h[i-1];
    f.resize(g.size()+h.size());
    merge(g.begin(),g.end(),h.begin(),h.end(),f.begin(),greater<int>());
    for(int i=1;i<f.size();++i) f[i]+=f[i-1];
    return f;
}

优化 DP#

通常与分治同时使用。

转移方程形如:

fi,j=maxj=0i/minj=0i{fi1,j+wi,ij}

f,w 均具有凸性,可以使用闵可夫斯基和优化至 O(n) 转移一行,改成分治求区间的 f 值,每一层的总规模 O(n),可以做到 O(nlogn)

例题#

QOJ-5421 Factories Once More#

考虑树上背包,设 fu,iu 子树内选 i 个节点的最大答案,转移是:

fu,i=maxj=0sizv{fu,ij+fv,j+j(kj)×w(u,v)}

注意到贡献函数是上凸的,转移形如 (max,+) 卷积,因此得知 fu 是上凸的,那么维护差分数组使用闵可夫斯基和优化。

需要启发式合并,维护单调不升的差分数组使用 Splay,而 j(kj)×w(u,v) 差分后是等差数列,维护一个加等差数列的标记即可。

时间复杂度 O(nlogn)

参考资料#

作者:SoyTony

出处:https://www.cnblogs.com/SoyTony/p/Learning_Notes_about_DP_Optimization_3.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   SoyTony  阅读(1132)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示