随笔分类 - 动态规划——树形
摘要:Description 给定一棵树,求它的最小点权覆盖集,其中允许强制某个点选或不选 Solution ddp用LCT维护 明确一个关系式:最小点权覆盖集=全集-最大点权独立集 那么n≤2000的暴力就很简单了,暴力修改,然后求最大点权独立集就好了(我在考场上就是这么写的) 关于正解,我采用的是动态
阅读全文
摘要:Description 给定一棵树,点带点权,允许修改点权,求每次修改之后树的最大独立集 Solution ddp用LCT维护 前置知识(静态树的最大独立集问题) 首先,我们要明确静态树的最大独立集的解法 定义$f[i][0/1]$表示在以$i$为根的子树中,该节点选/不选的最大权值,那么有状态转移
阅读全文
摘要:Description 给定一棵树,树上节点有点权、边有边权,求出一个点ans,使得cost最小,其中$cost=\sum\limits_{i=1}^{n}{val[i]*dis(ans, i)}$ Solution 树形dp 依旧是通过两次dfs解决 核心思想还是“二次扫描与换根法”(名词出自ly
阅读全文
摘要:Description 给定一棵树,求每一个点能到达的最远的距离是多少 Solution 树形dp 我们利用“二次扫描与换根法”的思想,首先假定1节点为根,然后在这棵有根树上进行一次dp,求出从每一个节点出发在其子树内最远和次远距离,记为sum1,sum2 我们在定义ans[i]表示在当前这棵有根树
阅读全文
摘要:这是一道树形dp和状压dp结合的题目,思考量和代码细节都不少。 我们首先定义f[i][j]表示在以i为根的子树当中,建立分部的节点状压之后为j的最大收益 那么转移是显然的,定义k为i的儿子,那么f[i][j] = max(f[k][l] + f[i][j ^ l] + val). 其中val表示其他
阅读全文
摘要:树的直径的模板题 我们存图以后,对这张图(树)进行一次dfs,定义sum1表示从当前节点向他的儿子走的最长路径是多少,sum2表示次长路径是多少。我们每次先用当前路径的长度+当前路径前往的节点的sum1更新当前节点的sum2,如果更新后sum2大于sum1,那么我们交换他们的数值,不难发现这样是正确
阅读全文
摘要:这是一道树形dp的基本模型——树的最大独立集问题。 这种基本模型的解法是这样的:定义f[i][1/0]表示在以i为根的子树中,i选/不选的最小代价是多少,那么答案是min(f[0][1],f[0][0])。 考虑状态转移,对于i的每一个儿子j,若i选择,那么j可选可不选,如果i不选,那么j一定选。
阅读全文
摘要:本人NOIP的考试题……也是我NOIP2018唯一爆零的题目,正因如此,本人无缘NOIP2018一等奖。 少年醒醒,都9012年了,还搞什么啊,赶紧想正解…… 本题的结构是一个树形的,因此我们可以用树形结构的相关知识解答。 本题的题目为“最小值最大”显然是二分答案的提示,因此我们二分答案最短的一条路
阅读全文
摘要:有关树形dp+二次扫描与换根法 首先我们读入数据,用邻接表存储,并记录每一个点相连的边的数量。 我们不妨先暂时假定节点1为树根,定义d[x]表示在以x为根的子树当中最大的流量,显然得出状态转移方程 d[x]=∑min(d[y],c(x,y)) 其中y∈son(x). 求出了d数组,我们考虑“二次扫描
阅读全文
摘要:树形dp可能是最优美的dp了…… 这是一道经典的树上背包问题,考虑两种做法。第一种是直接在树上做一遍背包问题,另一种是把这棵树转化成“左儿子右兄弟”的二叉树,再做一遍背包问题。 方法一:我们定义f[i][j]表示以i为根的子树,一共选j门课最大的分数,那么我们可以得到f[i][j]=max(f[i]
阅读全文