首页 > 其他分享 >树形dp

树形dp

时间:2025-01-18 14:44:02浏览次数:1  
标签:子树 int 最长 枚举 树形 节点 dp

树形dp

树上做dp非常常见,因为树本身有子结构性质(树和子树)
一般解题思路:先把树转化为有根树(如果不连通的树,就加一个虚拟根,它连接所有孤立的树),然后在做dfs,递归到叶子节点,再一层层返回信息,就在这一步做dfs

P2015 二叉苹果树

定义状态 \(dp[u][j]\) 表示以节点u为根的子树上留j条边时

换根dp

写的比较好的博客

P3478 STA-Station

板子题,比较适合练手

二叉树做法

考虑左右节点的边的总数是一定的,所以我们枚举一个子树的边就可以了

void dfs(int u){
	for(int i=0;i<=num;i++){//num代表子树内边的数量
		dp[u][i]=max(dp[u][i],dp[lson][i],dp[rson][num-i]);
	}
}

多叉树做法

我们挨个子节点枚举,然后再枚举当前子节点v选的边数,剩下的就是1~v-1 的子节点保留的分叉数

void dfs(int u){
	for(auto v:b[u]){//v是u的子节点
		for(int i=num;i>=1;i--){//枚举要割几条边
			for(int j=0;j<=i;j++){
				dp[u][j]=max(dp[u][j],dp[u][i-j-1]+dp[v][j]+w[u]);//i-j-1因为连向v也算一条边
                //实际上是dp[u][v][j]=max(dp[u][v][j],dp[u][v-1][i-j-1]+dp[v][j]+w[u]压掉v一维所以枚举i时要倒叙枚举
			}
		}
	}
}

P1352 没有上司的舞会

典题,不多赘述

P2014 选课

树上背包板子题,我们设 \(dp[u][t]\) 在u子树内选t个点所得到的最大值
所以我们的我们的针对一个子树内进行操作,枚举所有的子节点,再枚举要在这个子树內选取的点的个数 \(t\),再枚举一个在这个子节点的子树內枚举的点的个数 \(j\)

然后最后答案统计就是 \(dp[u][t]=dp[v][j]+dp[u][t-j]\)

一本通题解

T5:

神奇的一种转化,经典思路

考虑一条边对答案贡献了多少次

把用一条边把树分成两个部分,因为其是树边,所以一部分必然是一个端点的子树,另一部分是除去这个子树外的其余所有树,因为其说是至少一个端点是叶子节点,所以我们只要一部分一个叶子节点和另一部分的任意一个点组合即可

只需要统计一下该子树内的叶子节点和节点个数,然后另一部分的用总的减去该子树內的容斥即可

T6:

一个人走的情况就是求一下s能到达的最长距离,两个人的情况就是求一下树上最长链

额额额,手模出来的,再加上一些感性理解

树上最长链,可以求一下由这个点出发能到达这个子树的最远距离,然后最长链自然是用这个距离再加上另一条和这条路径不重复的最长路径,也就是在我们树形dp转移时统计一下最长和次长的距离即可(注意不可交,就是用其子节点转移即可)

注意,s能到的最长路径不能直接用你求树上最长链的答案,因为它是子树內的最长路径

T7:

巧妙地推式子题,考虑首先设我们以 \(i\) 为根时,包含 \(i\) 所构成的连通块并且满足有特殊值的方案数,这个是不好做的

考虑容斥,我们设 \(f[i]\) 为包含 \(i\) 所构成的连通块的总方案数,\(g[i]\) 为包含 \(i\) 所构成的连通块中不包含特殊值的方案数,最终答案即为 \(ans[i]=f[i]-g[i]\)

然后怎么求 \(f[i],g[i]\) ?

对于 \(f[i]=\prod_{j\in son[i]} (f[i]+1)\) 为什么呢,对于每一个子树都有 \(f[j]\) 种选的方案,还有一种不选 \(j\) 的方案

对于 \(g[i]\) 若其不为特殊点,则转移方式和 \(f[i]\) 一样,否则 $g[i]=0 $

然后注意因为是取完模之后,所以在求 \(ans[i]\) 的时候别忘了先加一个模数再取模

标签:子树,int,最长,枚举,树形,节点,dp
From: https://www.cnblogs.com/zcxnb/p/18678446

相关文章

  • 状压dp
    状压dp应用背景以集合为状态,集合一般可以用二进制表示,用二进制的位运算处理集合问题一般是指数复杂度的,例如:1.子集问题,设n个元素没有先后关系,那么一共有\(2^n\)个子集;2.排列问题,对所有n个元素进行全排列,共有\(n!\)个排列状态压缩:主要就是dp的一种状态,与dp转移关系不大位运......
  • 单调队列优化dp
    一本通题解T2:再也不想碰这道题了。。。写了一下午。我们先设状态\(dp[i][j]\)表示前i个刷匠,考虑了前\(j\)个木板后所获得的最大价值(\(j\)个木板可以有空余)。然后枚举前\(i\)个刷匠,枚举每一条木板。对于一条木板可以此刷匠根本不刷,或不刷当前木板,状转方程:\[dp[i][j]......
  • LCS(递归/记忆化/dp)
    题目链接:https://leetcode.cn/problems/longest-common-subsequence/TLE暴力递归+记忆化版本(基于字符串长度无优化版本)//注意text1[i1-1]==text2[i2-1]classSolution{public:intdp[1000][1000];intlongestCommonSubsequence(stringtext1,stringtext2){......
  • 漏洞预警 | WordPress Plugin Radio Player SSRF漏洞
    0x00漏洞编号CVE-2024-543850x01危险等级高危0x02漏洞概述WordPress插件RadioPlayer是一种简单而有效的解决方案,用于将实时流媒体音频添加到您的WordPress网站。0x03漏洞详情CVE-2024-54385漏洞类型:SSRF影响:获取敏感信息简述:RadioPlayer的/wp-admin/admin-......
  • 【韩国汉阳大学主办】第六届土木建筑及灾害防控国际学术会议暨第三届智慧城市建筑与基
    第六届土木建筑及灾害防控国际学术会议暨第三届智慧城市建筑与基础设施耐久性国际学术会议(CADPC&DuraBI2025)20256thInternationalConferenceonCivil,ArchitectureandDisasterPreventionandControl&3rdInternationalConferenceonDurabilityofBuildinga......
  • 斜率优化DP
    斜率优化DP例题HNOI2008玩具装箱朴素dp设\(dp_i\)表示前\(i\)个物品,分若干段的最小代价。状态转移方程为:\[dp_{i}=\min_{j<i}\left\{dp_{j}+\left(i-(j+1)+s_{i}-s_{j}-L\right)^{2}\right\}=\min_{j<i}\left\{dp_{j}+\left(s_{i}-s_{j}+i-j-1-L\right)^{2}\right\}......
  • 三大主流国际课程IBDP、AP、A-Level的区别是什么?-季遇教育
      最近咨询季遇老师的有不少孩子就读双轨制的学校的家长,还有很多想要体制内转轨的家长,都会问到如何选择合适的国际课程。今天就给大家介绍一下三大主流课程的区别!  IB课程  IB一共分为四个学段:IBPYP(小学)、IBMYP(初中)、IBDP(高中)、IBCP(职业教育)四个学段,其中IBDP......
  • CSP2025 - 树形 DP
    CSP2025-树形DPT1「MXOIRound1」城市这个“树上两点距离之和”很典,让我们想到换根DP。首先求出\(\text{siz}_u\)和\(d_u\),分别表示子树\(u\)的大小和子树所有点到\(u\)的距离之和。接下来求出整棵树的所有点到\(\boldsymbolu\)的距离之和。考虑用\(d_u\)......
  • ThreadPool解析
    Thread_Pool项目解析简介ThreadPool是一个轻量级的C++线程池实现,旨在简化多线程编程。项目分析我们首先上github的项目地址:https://github.com/progschj/ThreadPool,然后克隆项目到本地。点开项目的ThrealPool.h文件,查看源码:#ifndefTHREAD_POOL_H#defineTHREAD_POOL......
  • 树型DP
    ##树型DP**树型DP**,即在树上做动态规划。树是无环图,顺序可以是从叶子到根节点,也可以从根到叶子节点。一般树型DP的特征很明显,即状态可以表示为树中的节点,每个节点的状态可以由其子节点状态转移而来(从叶子到根的顺序),或是由其父亲节点转移而来(从根到叶节点的顺序),也可是两者结合。......