树形 dp

前言

天成大佬擅长的专题

正文

最重要的是分析有几种可能

根据第一步的可能性分析,列出所有需要的信息

这里的套路还没总结出来,我们先做点题

毛毛虫

这个题是大水题

但是

本蒟蒻错了……

为啥呢?

最长的毛毛虫可以不经过根!!!

LUK-Triumphal arch

二分 k 然后判定能不能赢

在之前几次染色时提前把这些没法染成黑色的儿子染成黑色

fi 表示以 i 为根(不包括 i)需要多少次支援

fi=cntik+max(fp,0)

如果 f10,那么当前二分到的 k 就是合法的,否则就是不合法的。

时态同步

水题

括号树

用栈维护

小凸玩密室

题解

侦察守卫

时间复杂度:O(nd)

以前整理的比较笼统

首先,我做的时候设的是 f 表示向下 j 层, g 是上下一起

转移 fu,j=fv,j1

但这显然不对

这是因为我没考虑清楚一些东西:

  1. 关键点与普通点的区别

  2. 覆盖会有一大部分是重叠的,别的点帮忙没考虑

先看第二个点

对于别的点帮忙,只需要考虑儿子对父亲的

为啥?

因为儿子对儿子的和父亲对儿子的很好处理,只需要在转移中不累加而是取 min

那还有对祖先的呢,这样就不能单纯 -1 了吧

对,所以加一维 j 表示向上覆盖几层

对于儿子给父亲覆盖完了的点,父亲就不用覆盖了,这需要在状态里扣掉

于是设 gu,j 表示 g 向下 j1 层有没有被覆盖随便,j 层及以下全部被覆盖的最小花费

关于第一点,我们可以不覆盖普通点

转化一下,如果这个点覆盖的点全是普通点,那么这个点覆不覆盖也没啥影响,这题算的是花费,我们直接把他的花费刨除掉,就是 fu,0=gu,0=0

但是,他可以转移成 0,但如果要用它去覆盖其他点,他的花费是要算的,于是 fu,j=valu ,jd

想转移时要把所有情况都列出来

  1. 我覆盖我,我的儿子被我覆盖

  2. 我被我的儿子覆盖

万事俱备!江东纵火团!放转移!

fu,i=min(fu,i+gv,i,gu,i+1+fv,i+1)

注意这里其实 g 都是要取一个 ,但转移时随着 fu,i 的更新就相当于取了

所以,转移是要先更新 f 再更新 g

震惊我一百年题

贪心思路看题解吧

fi,j,0/1 表示以 i 为根出发走 j 步,不回/回到根结点的最小新结点数

fi,j,0=max(fi,jt,0+fv,t2,1,fi,jt,1+fv,t1,0)

fi,j,1=max(fi,jt,1+fv,t2,1)

一个一个解释:

i 走到 vv 走,回到 vv 走到 ii

i 走,回到 ii 走到 vv

i 走,回到 ii 走到 vv 走,回到 i

树上染色

		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);
			}
		}

子树内的点到子树外的路径只有一条——经过子树的根和他的父亲

posted @   小惰惰  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
/* 鼠标点击求赞文字特效 */
点击右上角即可分享
微信分享提示

目录导航