树形 dp
前言
天成大佬擅长的专题
正文
最重要的是分析有几种可能
根据第一步的可能性分析,列出所有需要的信息
这里的套路还没总结出来,我们先做点题
这个题是大水题
但是
本蒟蒻错了……
为啥呢?
最长的毛毛虫可以不经过根!!!
二分
在之前几次染色时提前把这些没法染成黑色的儿子染成黑色
令
如果
水题
用栈维护
时间复杂度:
以前整理的比较笼统
首先,我做的时候设的是
转移
但这显然不对
这是因为我没考虑清楚一些东西:
-
关键点与普通点的区别
-
覆盖会有一大部分是重叠的,别的点帮忙没考虑
先看第二个点
对于别的点帮忙,只需要考虑儿子对父亲的
为啥?
因为儿子对儿子的和父亲对儿子的很好处理,只需要在转移中不累加而是取
那还有对祖先的呢,这样就不能单纯 -1 了吧
对,所以加一维
对于儿子给父亲覆盖完了的点,父亲就不用覆盖了,这需要在状态里扣掉
于是设
关于第一点,我们可以不覆盖普通点
转化一下,如果这个点覆盖的点全是普通点,那么这个点覆不覆盖也没啥影响,这题算的是花费,我们直接把他的花费刨除掉,就是
但是,他可以转移成 0,但如果要用它去覆盖其他点,他的花费是要算的,于是
想转移时要把所有情况都列出来
-
我覆盖我,我的儿子被我覆盖
-
我被我的儿子覆盖
万事俱备!江东纵火团!放箭转移!
注意这里其实
所以,转移是要先更新
贪心思路看题解吧
设
一个一个解释:
for(int j=min(m,siz[u]);j>=0;j--){
if(f[u][j]!=-1)f[u][j]+=f[v][0]+siz[v]*(n-m-siz[v])*e[i].w;
for(int k=min(j,siz[v]);k;k--){
if(f[u][j-k]==-1)continue;
int tot=(k*(m-k)+(siz[v]-k)*(n-m-siz[v]+k))*e[i].w;
f[u][j]=max(f[u][j],f[u][j-k]+f[v][k]+tot);
}
}
子树内的点到子树外的路径只有一条——经过子树的根和他的父亲
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】