随笔分类 -  动态规划--树型DP

摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3586 题意: 给定n个敌方据点,1为司令部,其他点各有一条边相连构成一棵树,每条边都有一个权值cost表示破坏这条边的费用,叶子节点为前线。现要切断前线和司令部的联系,每次切断边的费用不能超过上限lim 阅读全文
posted @ 2020-02-25 20:10 _Ackerman 阅读(301) 评论(0) 推荐(1)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4276 题意: 在一个n个节点的树形迷宫中,1为起点,n为出口。每个节点上有一定价值的珠宝,在节点之间移动的时间已知,问在能走出迷宫的前提下并且不超过m的时间内能收集的最多珠宝是多少? 思路: 我们首先考 阅读全文
posted @ 2020-02-25 20:03 _Ackerman 阅读(209) 评论(0) 推荐(0)
摘要:题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4044 题意: 给一棵n个节点的树,点1为敌方基地,叶子结点都为我方阵地。我们可以在每个结点安放炸弹,每点至多放一个,每个结点有k种炸弹可选,且每种炸弹有一个花费和一个攻击力(1点攻击力使敌人掉1点hp) 阅读全文
posted @ 2020-02-25 19:53 _Ackerman 阅读(277) 评论(0) 推荐(0)
摘要:题目连接:http://poj.org/problem?id=2486 题意: 一颗树,n个点,n-1条边,每个点上有一个权值,求从1出发,走k步,最多能遍历到的权值。 思路: 很容易想到设dp[x][j]表示x子树分配j步能获得最多苹果数量,但是这样是不够的,因为很容易发现只有哪些回到了x点的方案 阅读全文
posted @ 2020-02-25 19:34 _Ackerman 阅读(366) 评论(0) 推荐(0)
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 题意: 给一棵n个节点的树, 节点编号为1~n, 每条边都有一个花费值. 有k个机器人从S点出发, 问让机器人遍历所有边,最少花费值多少? 思路: 用f(i, j)表示子树i用j个机器人的最少花费 阅读全文
posted @ 2020-02-23 21:10 _Ackerman 阅读(325) 评论(0) 推荐(0)
摘要:题目连接:http://poj.org/problem?id=1947 题意:将一棵n个节点的有根树,删掉一些边变成恰有m个节点的新树。求最少需要去掉几条边。 思路: f[i][j] 代表以 i 为根的恰有 j 个节点最少需要删掉的边数 对于当前节点 u 的儿子 v ,我们可以取0,1,2,3... 阅读全文
posted @ 2020-02-23 21:01 _Ackerman 阅读(222) 评论(0) 推荐(0)
摘要:题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 思路: 我们定义f【i】表示编号为i的节点第一步向儿子方向走的最远距离 g【i】表示编号为i的节点第一步向父亲方向走的最远距离 p【i】表示编号为i的节点的父亲节点编号 w(a,b)表示编号a节点 阅读全文
posted @ 2020-02-23 20:41 _Ackerman 阅读(241) 评论(0) 推荐(0)
摘要:题意: 给定一个中序遍历为1,2,3,…,n的二叉树 每个结点有一个权值 定义二叉树的加分规则为: 左子树的加分× 右子树的加分+根的分数 若某个树缺少左子树或右子树,规定缺少的子树加分为1。 构造符合条件的二叉树 该树加分最大 输出其前序遍历序列 想法: 中序遍历的方法是 左子树 根 右子树 因此 阅读全文
posted @ 2020-02-22 16:10 _Ackerman 阅读(261) 评论(0) 推荐(0)
摘要:题意: 一棵 n 个点的无权树,求最⼩点覆盖 思路: 那么,我们考虑一个结点可以被谁染色,不难想出,可以有3种情况:被自己染色,被儿子染色,被父亲染色 我们不妨设: f[i][0] 代表被自己染色 f[i][1] 代表被父亲染色 f[i][2] 代表被儿子染色 设当前节点是 u ,儿子节点是 v 我 阅读全文
posted @ 2020-02-20 23:29 _Ackerman 阅读(229) 评论(0) 推荐(0)
摘要:题意: 给一棵 n 个点的边 + 点权树,求带权重⼼ 思路: 其实这题和之前那个 Sta 有点像,我们同样只需要预处理出一个 f[u] 代表以 u 为集合点的方便程度,那么我们就可以O(1)的转移了 假设 v 是 u 的儿子,f[v] = f[u] - (siz[v] * len) + (n - s 阅读全文
posted @ 2020-02-20 23:20 _Ackerman 阅读(230) 评论(0) 推荐(0)
摘要:题意: 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 发现从根从某个位置移到它的⼀一个⼦子树得出 ans 只要 O(1) 的时间 定义 f[u] 代表以 u 为根结点的深度和 假设 v 是 u 的儿子 ,那么 f[v] 其实就是 v 的子树的深度全部 -1 ,其他节点的 阅读全文
posted @ 2020-02-20 23:12 _Ackerman 阅读(217) 评论(0) 推荐(0)
摘要:题目大体上也算是一个树上背包的问题,只不过有个细节需要特别注意一下 父亲如果想要儿子的苹果,那么父亲和儿子之间必须要连接起来 设 f[u][j] 代表以 u 为根节点 保留 j 条边的最大价值 根据树上背包的转移方程我们很容易知道 f[u][j] = max(f[u][j] , f[v][k] + 阅读全文
posted @ 2020-02-20 23:01 _Ackerman 阅读(235) 评论(0) 推荐(0)
摘要:树上背包: 树形背包就是原始的树上动归+背包,一般用来处理以一棵树中选多少点为扩展的一类题,基本做法与树上dp无异,不过在状态转移方程中会用到背包的思想。 它基本上是这个样子的: 存图),然后dfs进去补全子节点的信息,f数组的意思是以fa为中转点,找出fa往下的可取1~j个点时各自的最大收益。 f 阅读全文
posted @ 2020-02-20 22:48 _Ackerman 阅读(272) 评论(0) 推荐(0)
摘要:前言: 每个子树的重心(p)的定义:删去该点p后,以x为根的子树的所有联通块的大小均不超过 siz[x] / 2 根据这个重心的定义可以知道一棵子树的重心必定在他自己所在的重链中. 所以每次找到他的重儿子为根的子树的重心, 不符合的话就沿着重链往上走直至找到复合要求的重心. 模版题:http://c 阅读全文
posted @ 2020-02-19 19:24 _Ackerman 阅读(652) 评论(0) 推荐(2)
摘要:前言 树的直径指树上距离最远的两点间的距离,它在树上问题上有许多应用,往往通过树的直径的性质可以将一个高时间复杂度的解法变为线性求解。 树型DP求解树的直径的方法:复杂度 O(N) DP求直径的方法是对于每个点记录这个点子树中的最长链及与最长链处于不同子树中的次长链,用每个点的最长链+次长链更新直径 阅读全文
posted @ 2020-02-19 18:22 _Ackerman 阅读(280) 评论(0) 推荐(0)
摘要:给定一棵树,求树的重心的编号以及重心删除后得到的最大子树的节点个数size,如果size相同就选取编号最小的. 首先要知道什么是树的重心,树的重心定义为:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重 心后,生成的多棵树尽可能平衡 #include <iostre 阅读全文
posted @ 2020-02-18 22:39 _Ackerman 阅读(494) 评论(0) 推荐(1)
摘要:问树中每个子树的大小: void get_size(int x) { siz[x] = 1; for (int i = 0;i < vec[x].size();i++) { get_size(vec[x][i]); siz[x] += siz[vec[x][i]]; } } 问树中每个节点的深度: 阅读全文
posted @ 2020-02-18 22:37 _Ackerman 阅读(335) 评论(0) 推荐(0)