随笔分类 -  动态规划——树形

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