『学习笔记』DP优化

dp 优化

wqs 二分

wqs 二分常用于优化一类 2D/1D 问题,一般解决凸函数求值,大部分 wqs 二分优化的 dp 都含有一维表示选择物品个数

例如:

\(n\) 个数分成 \(\leq m \ \text{or} =m\) 段,每段贡献是段内元素和的平方,总贡献是所有段的贡献和。

很容易地,设计状态:\(f_{i,j}\) 表示前 \(i\) 个数选择 \(j\) 段方案书。

朴素转移是 \(O(n^2m)\),四边形不等式优化可以做到 \(O(nm \log n)\),斜率优化可以做到 \(O(nm)\)

而 wqs 二分则是降低 \(m\) 这个维度的复杂度,看似对于大部分问题 \(m\) 应当是严格小于 \(n\) 的,但是也不可否认一些毒瘤题能出出来,所以正确地分析复杂度也是很重要的一部分。

考虑这个 dp 最后什么值对答案是有用的部分,可能有个粗略的界,就是考虑 \(F_i=f_{n,i}\) 是可以对答案产生贡献的。

而 wqs 二分在做什么呢?若函数 \(F\) 是一个凸函数,考虑用一个类似与二分答案然后把贡献放到数列算可行性的方法,我们考虑二分斜率

假设我们现在有一个斜率 \(k\),你希望得到啥?你拿这个斜率去切函数 \(F\) 他一定会有一个交点,现在我们希望的是这个切点的 \(x\) 坐标为 \(m\),通过判断这个切点的 \(x\) 轴在 \(m\) 左右侧而改变二分上下界,这个建议自行手玩,这样才能理解透彻。

其次有一点,大部分情况下都是猜函数凸性,所以如果 \(O(nm)\) 做不了的就直接猜然后打表。

此时我已经默认读者会 wqs 二分了。

例题:

CF739E Gosha is hunting

先考虑设计一个易想的状态,\(f_{i,j,k}\) 表示前 \(i\) 个神奇宝贝用了 \(j\) 个宝贝球和 \(k\) 个超级球,猜测固定 \(f_{i,j}\) 上凸,和 \(f_{i}\) 上凸,直接 wqs 二分套 wqs 二分就可以做到 \(O(n \log^2V)\)

P4383 [八省联考2018]林克卡特树

题意可以转化为求解恰好 \(K+1\) 条树上不交路径,权值最大值,猜可以 wqs 二分。

现在已经搞掉了 \(K+1\) 的限制,不难发现选出来路劲度数至多为 \(2\),设计 \(f_{i,0/1/2}\) 表示 \(i\) 子树内节点 \(i\) 的度数为 \(0/1/2\) 时的答案,假设现在二分到了 \(k\)

对于 \(f_{i,2}\) 可以直接将路径个数贡献的 \(-k\) 算入,因为转移不会连向 \(i\) 了,而 \(f_{i,1}\) 则需要延算 \(-k\) 的贡献,因为有可能连向 \(i\),设 \(g_{i}=\max\{f_{i,0},f_{i,1}-k,f_{i,2}\}\)表示一个点截掉后只考虑其子树内的答案。

转移按以下顺序转移:

\(f_{u,2}=\max\{ f_{u,2},f_{u,1}+f_{v,1}+w_{u,v}-k,f_{u,2}+g_v\}\)

\(f_{u,1}=\max\{ f_{u,1},f_{u,0}+f_{v,1}+w_{u,v},f_{u,1}+g_v\}\)

\(f_{u,0}=\max\{ f_{u,0},f_{u,1}+g_v\}\)

复杂度 \(O(n \log V)\)

posted @ 2023-10-27 15:13  Detect-Perplexity  阅读(9)  评论(0编辑  收藏  举报