DP优化:WQS二分 或 斜率凸优化 或 带权二分

标题说的三个玩意都差得不是很多。

上论文 : WQS二分

例 : 在树上选k条路径使得权值和最大。。。

形如这类选k个的问题,一般的做法是在DP中加一维表示已选了几条路径。

但是,毒瘤一点的出题人就会把范围开到10^5,MLE+TLE

这时就要用WQS二分这个小套路了。

既然在DP中加一维不可取,我们只能直接DP。

但是DP出来的结果并不一定是选了k个的。

大佬开始了他的妄想,要是结果刚好是选了k个的那岂不美滋滋?

蒟蒻说,这怎么可能呢?

大佬说,我用我的双手,成就你的梦想。

show time:

原来的Dp数组: F[n] = min { F[i] + something }

定义 H[n] = min { H[i] + something + cost }

我们来看H和F有何区别

H每转移一次就要多付出cost的代价。

转移一次的物理意义(现实意义)就是多选了一个!!!!

既然选的个数多会付出代价,自然H[x]取最值时选的个数就会比F[x]取最值少。

然后可以通过调控cost(二分),进而调控选的个数为K。

蒟蒻说,可是你算的是H(n,K),我要的是F(n,K)

大佬说,随便画个柿子就推出来了

: F(n,k) = H(n,k)- cost * k

大意:通过引入可控常数控制选的个数,用另一个很好算的方式算出F(n,k)

蒟蒻开始码,3行过后,开始沉思,这个H怎么算啊!

大佬说,斜率优化凸包单调栈啊,再不济CDQ分治平衡树维护凸包都行啊。

蒟蒻打开了百度,数十行(年)后,开始二分。

大佬一声喝住,你没发现这个二分有问题吗?

蒟蒻说,我对二分答案还是很自信的。

大佬说,万一H[x]关于cost变化时没有最值呢?

蒟蒻说,你在说啥?

大佬说,万一H[x]不是一个先降后增的单峰函数呢?

蒟蒻说,你在说啥?

大佬说,所以F[x]应该是一个斜率单调不降的函数。

蒟蒻说,你在说啥?

大佬说,二分边界要小心。

蒟蒻说,噢,大佬真牛,这都想到了。

大佬:。。。。。。

为什么叫DP凸优化呢,因为F[x]斜率单调不降才能用二分代替一维DP。

为什么叫带权二分呢,给物品加上权好控制选的个数。

蒟蒻 : 真是恶心。

猜你喜欢

转载自blog.csdn.net/qq_35950004/article/details/80819943