决策单调性

小 trick 不足挂齿。


考虑一个最优化分段 dp 状物 dpimaxj=1i1{dpj+w(j+1,i)},然而你只会 O(nc) 转移,其中 c 是计算权值的复杂度。

这时候我们尝试使用决策单调性,也就是最终转移到 ij 和最终转移到 i+1k 始终有 jk

想发现是否有这样的性质也并不难。考虑到 i 的两条转移 dpu+w(u+1,i)dpv+w(v+1,i) 且满足 u<v,你只需要保证存在性质 dpu<dpv 且后面那个东西的增量也满足 Δu<Δv 就行了。

然后就做完了。分 k 段的话就把 dp 数组变成 2D 的,然后尝试发现对于分相同段数存在决策单调性。


下面说说写法。

这东西绝不能双指针。虽然决策点的位置满足单调性,但是每个点上面的贡献完全不一定单调,所以双指针二分什么的都不行。

考虑分治。考虑拿下区间 [1,n] 的中点 dpmid 的转移点,显然可以 O(nc) 取得,然后往两边分治,这样每次需要考虑的决策点折半,需要考虑的被转移点也折半,于是复杂度 O(cnlogn)

值得注意的是,需要考虑的决策点到 mid 之间可能会有一段距离,这一段的贡献也要加进去。


特别地,有时 w 可能存在一种简便的算法是把 j+1i 这样扫一遍,但是我们并不能这样做。

这个东西如果能合并的话可以尝试用莫队的写法。

随便考虑一下可以发现,从父节点向下分治,移动(正向和逆向加一起)的级别是 O(rl) 的,子节点之间互相移动中,左右端点最多各扫一遍,也是 O(rl) 的,合在一起每一层都是 O(rl) 的,那么总的端点移动复杂度就是 O(nflogn)f 是合并信息的复杂度。

posted @   Shunpower  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示