树形dp
小菜鸡加油
菜鸡
什么都能折磨
展开
-
D. GCD Counting(dp直径+连续gcd)
https://codeforces.com/problemset/problem/1101/D思路:一段gcd维护序列的公共质因子即可。2e5里面质因子个数就十几个。对于当前根节点,判和子树中哪个质因子相同就可以达到gcd>1。然后转移。O(n*8*8)。筛后处理147ms结束#include<iostream>#include<vector>#include<queue>#include<cstring>#include<原创 2021-05-25 20:36:07 · 306 阅读 · 0 评论 -
C. Parsa‘s Humongous Tree(树形dp+贪心)
https://codeforces.com/contest/1529/problem/C思路:树形dp;对于当前的根节点取哪个值呢。暴力整个可取范围不行。可以发现,取两端点一定可以产生最值。类似绝对值不等式,放到数轴上去,|x-a|+|x-b|+|x-c|取端点产生极值。那么我们就可以直接每次取两点端点来转移了#include<iostream>#include<vector>#include<queue>#include<cstrin原创 2021-05-25 12:23:30 · 258 阅读 · 0 评论 -
P3177 [HAOI2015]树上染色(树形背包N^2)
https://www.luogu.com.cn/problem/P3177思路:过了这道板子题我才发现我背包的复杂度一直是假的。1.不能先更新完u的siz,要边背包边更新siz2.由于树上背包本身压维,细节是要仔细考虑的,否则丢掉上一层状态和同层状态互相转移是经常会发生的。比如本题k=03.注意下图两者的合并区别。#include<iostream>#include<vector>#include<queue>#include&l原创 2021-05-13 00:54:03 · 221 阅读 · 0 评论 -
D. Nastia Plays with a Tree(树形dp)
https://codeforces.com/contest/1521/problem/D思路:把树上的单链初始时每个点是一个链。然后类似树形dp递归。递归过程中模拟链的断开,拼凑新的链头链尾。代码比较清晰#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include原创 2021-05-08 16:03:08 · 389 阅读 · 1 评论 -
E. Alternating Tree(点分治/贡献法+树形dp)
https://codeforces.com/problemset/problem/960/E思路:开始容易观察到奇数长度的路径在正反算两次的情况下对答案贡献+0.而偶数长度翻倍。可以由此去统计dp[u][2]表示当前节点子树中往上到当前节点i的长度为偶数的路的A(vuj,vui)的和,num[u][2]表示从子树往上到当前节点i奇数长度的路径与偶数长度的路径的个数。不过我觉得这个思路有点不直观...参考:https://blog.csdn.net/ACTerminate/article/det原创 2021-05-04 18:17:53 · 225 阅读 · 0 评论 -
Information Disturbing(树形dp)
http://acm.hdu.edu.cn/showproblem.php?pid=3586思路:开始照着重建道路跑树形背包了。发现并不行。这题只要1维就够了。dp[u]以u为根的子树切断了和叶子所有的关系的价值和。然后将答案转化成二分判定当前dp[1]是否>=m#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cm原创 2021-05-04 15:09:11 · 214 阅读 · 0 评论 -
Apple Tree(树形背包)
http://poj.org/problem?id=2486思路:很多把它看成了分组背包..其实不用用d[i][j]表示从i点开始走j步能够获得的最大价值,但是这个题不同的地方,就是如果i到另一棵子树合并的时候,是要往回走步数的。因此这个题要多开一维讨论从i出发走j步之后是否回到i。(因为只有回到i之后,才能再从i向其他地方走。)因此状态应该设计为d[i][j][0/1],表示从i出发走j步后是否回到i,0表示回,1表示不回转移方程:对于回到i的,和之前的背包一样,不.原创 2021-05-04 11:48:43 · 174 阅读 · 0 评论 -
ZYB‘s Tree(树上每个点距离为k的点)
http://acm.hdu.edu.cn/showproblem.php?pid=5593思路:经典,以前碰过一次。但是其中一个思路也对。自己调了一小时还是不知道哪里的问题。样例没过。干脆换一种,思路是一样的。首先距离为k来自u的子树,dp[u][j]+=dp[v][j-1]但是答案还有来自父亲以上的一块和u的兄弟,也就是父亲以下的一块。对于来自父亲以上的,换根后第二次dfs的时候直接转移过来。对于父亲以下的,算为dp[u][j-1]-dp[v][j-2],去除本身子树的那部分距离。原创 2021-05-03 23:57:46 · 363 阅读 · 0 评论 -
P1273 有线电视网(树形dp)
https://www.luogu.com.cn/problem/P1273思路:dp[i][j]:以i为根的子树服务j个用户的最大收益。答案遍历到dp[i][j]>=0的时候更新最值#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<s.原创 2021-05-03 20:57:46 · 286 阅读 · 2 评论 -
P1272 重建道路(树形背包)
https://www.luogu.com.cn/problem/P1272温故知新思路:我记得去年的时候看这个题解懵逼了挺多的...今年理清楚了。通常来说做树形dp的时候一般默认u和u的儿子都是连在一起的。但是这个题是要删边的。dp[i] [j] 表示以i为根的子树,保留j个节点,且当前子树与父节点相连,拆掉的最小边数。所以:我们初始化的时候dp[i][1],考虑当前子树为最终答案的合法情况,即u要和其儿子的边都断开才是合法dp。因此dp[u][1]=son[u].原创 2021-05-03 15:07:58 · 136 阅读 · 0 评论 -
P2016 战略游戏(dp)
https://www.luogu.com.cn/problem/P2016思路:类似上司的舞会#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>#include<set>#include<cstdio>#include<algorithm>原创 2021-05-03 12:46:47 · 180 阅读 · 0 评论 -
P2458 [SDOI2006]保安站岗(树形dp-最小支配集)
https://www.luogu.com.cn/problem/P2458思路:1.dp[u][0]:u节点由子节点照看的当前子树的总代价2.dp[u][1]:u节点由本身照看的当前子树的总代价3.dp[u][2]:u节点由父节点照看的当前子树的总代价其中对于dp[u][0],转移的时候要注意要至少选择一条dp[v][1],因此若dp[v][0]统统小于dp[v][1],需要在一个子树上取出dp[v][1]和dp[v][0]的最小差值加上去保证dp[u][0]的合理性和子树的合法.原创 2021-05-03 12:09:28 · 168 阅读 · 0 评论 -
The more, The Better(树形背包)
http://acm.hdu.edu.cn/viewcode.php?rid=35926300思路:以前做的题其实也挺经典的..值得回顾合并子节点的时候考虑当前子节点和前面子节点的合并好的状态,当前这颗子树拿x个,前面的总状态需要预留k-x个。然后注意虚拟原点的原因多个1个能打的体积#include<iostream>#include<vector>#include<queue>#include<cstring>#include&原创 2021-05-02 20:57:31 · 76 阅读 · 0 评论 -
B. Appleman and Tree(树形dp)
https://codeforces.com/problemset/problem/461/B思路:dp[i][0/1],dp[i][0]表示以i为根节点的树其中 i 所在的连通块没有黑点的方案数,dp[i][1]表示以 i 为根节点的树其中 i 所在连通块有黑点的方案数。然后考虑。如果当前i点本身是黑色,那么其可以和dp[v][0]这条边乘起来并且方案数乘起来累加到答案上去。如果当前i本身是黑色,那么其和dp[v][1]这条边就要断开,此时整体答案也是两者相乘累加到答案上去。如果i原创 2021-04-30 23:42:31 · 105 阅读 · 1 评论 -
D. Serval and Rooted Tree(思维+树形dp+二分辅助)
https://codeforces.com/problemset/problem/1153/D思路:参考issuehttps://issue-is-vegetable.blog.csdn.net/article/details/107760491?utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-1.control&dist_request_id=原创 2021-04-13 23:54:10 · 142 阅读 · 0 评论 -
CCA的子树(树形dp)
https://ac.nowcoder.com/acm/contest/11168/C思路:算出来每个点为根的子树和然后暴力n^2更新都可以做。但是要dp改进到on。定义:mx[u]:以u为总根的子树的最大值。于是每个点都可以求出来其u本身这棵大子树或者u里面某个儿子或者孙子的子树中综合的一个最大值。那么此时跑dfs时,一个点就是代表其一边下方的最优子树状态。然后这样去枚举就可以达到全部状态的枚举了。不同于换根,跑后序,把最左边的大子树内部更新好后更新最左边的大子树,然.原创 2021-03-13 01:03:47 · 147 阅读 · 0 评论 -
D. Choosing Capital for Treeland(思维+换根dp)
https://codeforces.com/problemset/problem/219/D思路:n^2暴力dfs好写吧。好写那就改成换根dp。先dp[u]跑以u为根的子树结果。再dfs一遍以u为根到整棵树的结果#include<iostream>#include<vector>#include<queue>#include<cstring>#include<cmath>#include<map>原创 2021-03-12 17:23:58 · 125 阅读 · 0 评论 -
2020ccpc威海C Rencontre(树上各块中任意两点距离之和)
参考博客:https://blog.csdn.net/qq_45458915/article/details/109294160分割内容参考自学长博客题目大意:给出一棵带权树,规定,解释一下就是当确定三个点 u1 , u2 , u3 后,需要找到一个点 v 到三个点的距离之和最小,现在给出 u1 , u2 , u3 的可行取值,问 f 函数的期望是多少题目分析:考虑转换模型,对于给定的 u1 , u2 和 u3 来说,不难猜出点 v 是唯一存在的(不会证明),相应的这个最短的距离之和也是唯一确.原创 2020-10-29 23:31:07 · 1081 阅读 · 0 评论 -
P2986 [USACO10MAR]Great Cow Gathering G(带点权树重心/树形dp+换根dp)详解
https://www.luogu.com.cn/problem/P2986先说带点权的树重心做法:https://blog.csdn.net/zstuyyyyccccbbbb/article/details/108558682树的重心的定义以及一些性质。如果这个树有点权和边权怎么办?关于边权:其实和所有边为单位1的重心一模一样。(网上搜了搜没怎么有比较详细的说明的,姑且当性质结论1)关于点权:把”最大的子树节点数最少“改成“最大点权块最小”。感性证明:把这个问题转化成刚在.原创 2020-10-07 17:38:21 · 418 阅读 · 0 评论 -
E. Tree Painting(思维+树形dp+换根dp)
https://codeforces.com/problemset/problem/1187/E首先一个很重要的点就是选了一个点之后,这颗树就会被分成两个子树,然后选左边和右边就是“独立”的了。先选左边和先选右边就不会有顺序上的影响了。然后对于左边再进行选择又回来刚才的状态。所以说选了一个点后后面的答案就确定了。所以考虑枚举每个点作为根节点。f[i]表示以i为根的子树获得的最大值。f[i]=siz[i](以i为根的子树)+总和(v是i的儿子)f[u].那么这样暴力是O(n^2)的。比较常原创 2020-09-17 00:27:11 · 220 阅读 · 0 评论 -
A. The Fair Nut and the Best Path(无根树dp详解)
https://codeforces.com/problemset/problem/1083/A题意:到达一个点得到这个点的价值,经过一个边花费这个边的价值,求得到的最大价值思路:之前碰过一些无根树的问题,有些是直接定1为根就可以了不用考虑其他,但是有些不行。比如树的重心,一种方法是定1为根然后考虑dp转移过程中该节点“头上”的量。比如树的直径,确实可以两次dfs求,树形dp的求法也是类似考虑节点“头上”的量。这题是个无根树,考虑头上的量。先考虑以u为根节点的子树,1.u是起点,那么就.原创 2020-09-16 17:21:53 · 293 阅读 · 0 评论 -
B. Zero Tree(思维+树形dp)
题意翻译题目描述一棵树是一个有n个节点与正好n-1条边的图;并且符合以下条件:对于任意两个节点之间有且只有一条简单路径。我们定义树T的子树为一棵所有节点是树T节点的子集,所有边是T边的子集的树。给定一颗有n个节点的树,假设它的节点被编号为1到n。每个节点有一个权值,v_ivi表示编号为i的节点的权值。你需要进行一些操作,每次操作符合以下规定:- 在给定的这棵树中选择一棵子树,并保证子树中含有节点1- 把这棵子树中的所有节点加上或减去1你需要计算至少需要多少次操作来让所有的节点原创 2020-09-13 20:02:12 · 996 阅读 · 0 评论 -
C. Link Cut Centroids(求树的重心)
https://codeforces.com/contest/1406/problem/C做这个题前提是要知道树的重心。百度拉了一下。引用一下:https://blog.csdn.net/weixin_43810158/article/details/88391828树的重心定义为树的某个节点,当去掉该节点后,树的各个连通分量中,节点数最多的连通分量其节点数达到最小值。树可能存在多个重心。如下图,当去掉点1后,树将分成两个连通块:(2,4,5),(3,6,7),则最大的连通块包含节点个数为3。若原创 2020-09-13 09:24:21 · 2886 阅读 · 2 评论 -
F. Maximum White Subtree(树形dp+换根dp)
https://codeforces.com/problemset/problem/1324/F题目描述You are given a tree consisting ofnnvertices. A tree is a connected undirected graph withn-1n−1edges. Each vertexvvof this tree has a color assigned to it (a_v = 1av=1if the vertexvvis whit...原创 2020-09-02 14:44:04 · 314 阅读 · 0 评论 -
D. Distance in Tree
https://codeforces.com/problemset/problem/161/DAtreeis a connected graph that doesn't contain any cycles.Thedistancebetween two vertices of a tree is the length (in edges) of the shortest path between these vertices.You are given a tree withnve...原创 2020-08-20 09:58:41 · 282 阅读 · 0 评论 -
The more, The Better(树上DP+依赖性背包)
HDU – 1561ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?Input每个测试实例首先包括2个整数,N,M.(1 <= M <= N <= 200);在接下来的N行里,每行包括2个整数,a,b. 在第 i 行,a 代表要攻克第 i 个城堡必须原创 2020-08-07 00:31:42 · 210 阅读 · 0 评论 -
Anniversary party
http://acm.hdu.edu.cn/showproblem.php?pid=1520Problem DescriptionThere is going to be a party to celebrate the 80-th Anniversary of the Ural State University. The University has a hierarchical structure of employees. It means that the supervisor relation原创 2020-08-06 20:47:39 · 117 阅读 · 0 评论 -
树形dp(dfs求法详解以及证明)(例题:共同抗疫)
更好的观看体验:http://www.yyycode.cn/index.php/2020/04/07/b-%e9%bd%90%e5%bf%83%e6%8a%97%e7%96%ab/因为做之前不知道树形dp,所以这道题当时自己的想法只有floyd,骗了48分。这里附上floyd的超时代码说下自己当时写了这代码但是debug好久,原因时这是个无向图,需要两边建边,只有一边肯定是出...原创 2020-04-07 15:11:48 · 439 阅读 · 0 评论