随笔分类 -  ACM / 动态规划 树形dp

摘要:原题链接 考察:树形dp(?) 思路: 主要利用的两个性质: (1) 以树的重心为根时,所有子树的大小都不超过整棵树大小的一半. (2) 把两棵树通过一条边相连得到一棵新的树,那么新的树的重心在连接原来两棵树的重心的路径上. 注意性质1不是子树的和,以贪心来考虑的话,我们对于根节点$u$,其最大的子 阅读全文
posted @ 2021-07-17 12:10 acmloser 阅读(56) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp+二分 思路: 化为01分数规划后,每个人的贡献是 p[i] - mid*s[i],注意一下后面并非图论问题,因为不需要回到源点.因为取某个人的条件是那个人的推荐人也在队列中,所以是树形背包问题. 普通的树形背包时间复杂度是O(n3),TLE是明显的.(所以本蒟蒻紧急学了树形 阅读全文
posted @ 2021-05-06 22:10 acmloser 阅读(57) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp 思路: 树上最大值,最小值,方案数是树形dp常考的问题.这里设置f[i][j]为在以i为根的子树中,i的颜色是j的最大结点数. 设置2为绿色,初始化所有f[i][2] = 1.如果当前父节点u只有一个子结点x f[u][k] += max(f[x][j]) j!=k. 如果 阅读全文
posted @ 2021-04-08 19:06 acmloser 阅读(61) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp 思路: 换根dp,f[i][j][0]表示以i为根的子树中与i距离不超过j的权值和.f[i][j][1]表示以i为起点,往上走距离不超过j的点集合. 易知f[i][j][0] += f[v][j-1][0] 其中f[i][0][0] = w[i] 如果是往上走:f[v][j 阅读全文
posted @ 2021-04-08 14:21 acmloser 阅读(38) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp 错误思路: 换根dp,正向点权值0,逆向点权值1.求每个点到其他点的距离和. 此思路错在会多次计算要旋转的边. 思路: 换根dp,需要两次dfs求当前结点i往下走的逆转数和往上走的逆转数.向下走的计算很容易 f[u][1]+=f[v][1]+road[i].w 向上走如果直 阅读全文
posted @ 2021-04-08 00:58 acmloser 阅读(37) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp 想了半天没想出来怎么从父节点的深度和推到子节点深度和,我果然fw 思路: 换根dp模板题.也称二次扫描法,第一次多用于预处理,第二次多用于计算答案. 第一次dfs时,用子节点更新父节点,计算每个结点的子树结点个数,并计算当前假定根的深度和 第二次dfs时,用父节点更新子节点 阅读全文
posted @ 2021-04-07 20:17 acmloser 阅读(38) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp 推dp转移方程的时候,总是忘记f数组原来定义的含义...初始化也可以帮助推出dp数组. 思路: f[u][j] 表示以u为根的子树中,保留j个点最少的剪枝数.初始化f[u][1] = son[u].这样初始化一开始点都是独立的,通过下面的转移方程将它们连起来. 那么dp转移 阅读全文
posted @ 2021-04-07 12:31 acmloser 阅读(66) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp 思路: 参考大佬的思路,本蒟蒻还以为是有依赖的背包问题,但是直接开背包数组会MLE. 定义f[i]为以i为根节点的子树中,最大的结点和.f[i] = max(f[i],f[j](j为i的所有直接或间接的子节点)). 这道题是选两个不相干的最大子树和,需要在每个结点处取最值. 阅读全文
posted @ 2021-04-07 02:08 acmloser 阅读(53) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形背包dp 思路: 首先我们需要拿一个变量作为背包的体积,不能以钱数做体积,因为范围没有给定.所以只能以人数做体积.f[i][j]表示以i为根节点的子树中,选j个人的最大花费.如果>=0表示方案可行.因为人数是可以枚举的,所以不会漏解. 这里要注意的是背包体积不能直接设为m,否则会 阅读全文
posted @ 2021-04-01 19:10 acmloser 阅读(47) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp 思路: 设f[i][j]表示和为i,j==1表示经过了>=d的边,j=0表示未经过的方案数.以最后一步来划分集合,最后一步的和为i-j,此时边为j,那么状态转移方程是: if(j>=d) f[i][1] = f[i-j][0]+f[i-j][1] else f[i][1] 阅读全文
posted @ 2021-02-18 14:54 acmloser 阅读(57) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp+约数 思路: 预处理约数之和,用倍数法,时间复杂度10^6次方左右,sum[i]<i的建立边.通过打表可知是不止一棵树,也就是数字建立的图是森林.对于遍历过的点标记一下,没标记的遍历即可.最后就是求树的直径. 倍数法中:j枚举了i的倍数 1 #include <iostre 阅读全文
posted @ 2021-02-17 18:18 acmloser 阅读(58) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp+二分 这道题正解思路有点像二分典型题搬石头.本蒟蒻是没想出来... 思路: 这道题有3个限制条件: 裁取的边要使得叶子不能到1. 裁取的边和要<=m 裁取的边的权值要尽量小. 直接递推根本递推不出来,如果设置叶子节点的f[u] = INF,那么叶子结点到父节点之间的边权值一 阅读全文
posted @ 2021-02-17 16:36 acmloser 阅读(47) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形背包dp 本来不想写这篇的题解,因为和前面的题重复了...但是WA了3次才对,还是写一下吧.. 思路: 将每20个虫子看成财宝的一个体积.m是背包的体积.这就是带体积的树形背包问题了.但是要注意的是,当某个洞穴虫子=0,我们还需要派人去拿.这个处理很简单,让f[u][0]=0就可 阅读全文
posted @ 2021-02-17 14:16 acmloser 阅读(49) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp 树的重心变种题 重心定义:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。(不止一个) 模板题 树的重心 思路: 把树的某个点删去后,剩余部分是不包含父节点的子节点连通块.已经删去点的父节点连通块.通过dfs可以求出 阅读全文
posted @ 2021-02-17 12:36 acmloser 阅读(40) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp 本蒟蒻是完全没思路,看了网上的题解思路普遍是: 对于一棵树,每拆掉一条边就形成一条链.对于一个有多子节点的结点u,我们可以保留父节点到u的边和u到一个子节点的边.也可以保留两个子节点的边去掉其他的边.看了大部分题解都是默认去掉父节点边是最优解. 本蒟蒻是没想出来证明 = = 阅读全文
posted @ 2021-02-17 01:22 acmloser 阅读(22) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp(?) 思路: f[i]表示i往下(包括i)的点权值和.对比学生总和sum-f[i]与f[i]的大小即可. 这题貌似和m没多大关系.m一定=n-1. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 阅读全文
posted @ 2021-02-16 22:19 acmloser 阅读(57) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp 关于本题的相关题目 10. 有依赖的背包问题 和 1074. 二叉苹果树 都是一个套路. 思路: 有依赖的背包问题套模板题.关于几点需要再修正: 绝对不要在dfs遍历连接点的时候+w[u].因为f[u][j] = max(f[v][k]+f[u][j-k],f[u][j]) 阅读全文
posted @ 2021-02-16 19:41 acmloser 阅读(82) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp 这道题战略游戏要求看到所有的边,本题要求看到所有的点 没想出来,参考了大佬的思路 照搬大佬的思路: 设树上某点u能被看见,这个点要么自己安插士兵,要么父节点安插士兵,要么子节点安插士兵.设f[u,st]表示u的st状态的最小花费.st==0时,它u被父节点看见,st==1, 阅读全文
posted @ 2021-02-16 17:22 acmloser 阅读(75) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp 思路: 因为要观察到所有的边,所以每条边上的点至少要放一个士兵,对于某子树的根u,f[u][1] = min(f[v][1],f[v][0]),f[u][0] = f[v][1]. md,我是zz,看成要看到所有的点,导致这道题我没想出来= = 1 #include <io 阅读全文
posted @ 2021-02-16 12:42 acmloser 阅读(77) 评论(0) 推荐(0) 编辑
摘要:原题链接 考察:树形dp 思路: 树形背包的时间复杂度是O(n3) 按划分给子节点的体积来分配集合.思路与苹果树大体相同.关于几个问题需要解释下: 为什么不和苹果树那题一样在遍历点的时候+w[u]. 答: k不一定能装下,会使得背包里的价值多了.除此之外,f[u][j] = f[u][j-k]+f[ 阅读全文
posted @ 2021-02-16 03:22 acmloser 阅读(27) 评论(0) 推荐(0) 编辑