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

传送门

想一下,把一条边弄成\(0\),然后连起来

那这条边有毛价值,神经病

所以题意是树上选\(m+1\)条链,权值和最大

我们令每个点的点权为父边的边权

考虑一个我想不到的暴力\(dp\)

\(f[u][j][0/1/2]\)表示以\(u\)为根的子树,已经选了\(j\)条链,当前节点被选择与\(0/1/2\)个节点相连的最大价值

\(u\)\(0\)个节点相连时,直接从子树中选\(m\)条链

\(f[u][j][0]=max\{f[v][k][0]+f[u][j-k][0]\}\)

\(u\)\(1\)个节点相连时,讨论从已经处理的子树中选还是从新子树中选

\(f[u][j][1]=max\{f[u][k][0]+f[v][j-k][1]+a[i].val,f[u][k][1]+f[v][j-k][0]\}\)

扫描二维码关注公众号,回复: 10391239 查看本文章

\(u\)\(2\)个节点相连时,说明这条链的端点分别在两个子树内,我们讨论自己和儿子拼起来和原本子树中已经有了的情况

\(f[u][j][2]=max\{f[u][k][1]+f[v][j-k-1][1]+a[i].val,f[u][k][2]+f[v][j-k][0]\}\)

中间\(j-k-1\)是因为我们不把\(1\)算作已经选出的链,但是\(0/2\)都算作已经选择完毕的链

由于\(1\)不算作已经选出,所以可以从\(0\)\(m\)转移,需要注意

然后为了向上传递方便,我们需要合并答案

\(f[u][j][0]=max\{f[u][j][0],f[u][j-1][1],f[u][j][2]\}\)

暴力\(dp\)就做完了,如果加上下界优化应该是\(O(nk)\),但是我也不会证明

考虑选择的数量这个问题,感性的理解它应该是一个上凸函数,一开始会选价值最高的链,后面的链价值越来越低,斜率越来越小

那么可以考虑\(WQS\)二分,优化掉数量维,每选出一条链减去一定代价

最后算出最大价值选择的链数

成功优化到\(O(nlogn)\)级别

猜你喜欢

转载自www.cnblogs.com/knife-rose/p/12617052.html