• 洛谷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]})

    (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))级别

  • 相关阅读:
    zsh: command not found: mysql
    ReactiveX -Rx
    mac 安装mysql
    mac 完全卸载mysql
    gradle 编译OutOfMemoryError
    Nginx均衡负载(IP_HASH)未生效
    Tomcat集群+Nginx+Redis服务搭建
    Spring之SpringMVC的RequestToViewNameTranslator(源码)分析
    Spring之SpringMVC的MethodNameResolver(源码)分析
    Spring之SpringMVC前端控制器DispatcherServlet(源码)分析
  • 原文地址:https://www.cnblogs.com/knife-rose/p/12617052.html
Copyright © 2020-2023  润新知