Fork me on GitHub

凸优化DP

凸优化DP

简介

凸优化用于一类dp优化的问题

可以把一个$O(n)$的复杂度优化成$O(\log n)$

如果我们最后的dp数组在某一维上是凸壳就可以用凸壳来维护

在这种问题中我们如果不管这一维的影响可以很快地求出极值

我们就可以用凸优化的思想来操作

算法流程

假设我们的dp数组是$F(x)$并且满足$F(x)$的导数是单调函数

我们就可以对$F$函数进行一定的修改使得$F’(x)=F(x)+kx$函数的极值落在我们需要求的那一个点上

于是我们可以对斜率k进行二分,来求出最合适的那一个值

具体来说,这道题里面我们需要求的是树上k+1条点不相交路径的最大权值和

我们发现如果设$F(x)$表示选出x条不相交路径的最大权值,最后的F函数是一个上凸壳

然后我们就可以考虑二分出斜率的偏移量$w$

考虑它的实际意义,就是说每次多选出一条路径就需要加上额外的$w$代价,这样dp我们只需要记录最值和对应的路径条数就可以了

至于是要让路径条数最大化还是最小化因题而异

其实挺简单的算法,多做几道题就会了

loj2478
floj1935
WF2016 B