![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树形dp
文章平均质量分 64
goto_1600
我何来寂寞,哪有寂寞可言。
展开
-
Tree Shuffling(树形dp)
link题意:给你一棵以1为根的树,和每个点的a,b,c ,a代表操作的花费,b代表当前他的值,c代表目标值,每次你可以选一个点花费k*size两两交换他的子节点,问让所有值变成目标值的花费。思路:一开始想到可以从根到u的交换值取min,对于原始和目标值相同的点我们可以不用管,因为早晚还要进行一次交换,证明:假设有1/1 0/1 1/0,我们操作{1/1,0/1},{0/1,1/0},不如直接操作{0/1,1/0}.后来就想不到了,题解说可以设dp[u][2]代表遍历到u,0/1还没有处理的个数原创 2021-08-08 12:39:44 · 234 阅读 · 0 评论 -
选课
题意:某个课只有它父节点选的时候他才能选,问n个点构成的树,选m个课的最大学分数。思路:构建一个虚拟节点0,那么0就是必选了,把选的课数量+1,对问题造成的影响是等价的,然后就是熟悉的分组背包问题了,早上卡了很久,因为要空出一格来放父亲的节点,然后对于背包dp的顺序是不能改变的,1物品组2体积最后是决策,里面只能选m-1个点,因为要留一个给自己放。ac代码:#include<bits/stdc++.h>using namespace std;const int N=310;int .原创 2020-10-22 15:40:30 · 218 阅读 · 0 评论 -
积蓄程度
题意:找一个点作为源点,问能往周围流的最多的水流。树形dp,dp数组代表以i为根的能流的所有水流,转移很简单,看代码,然后我们要处理一下从父节点流下来的值。如图。之前wa了三十分钟,是因为转移的时候忘记考虑了父节点子树给他的贡献,从上面留下来的水流包括父节点父节点流下来的水流+子树的水流,然后别忘记特判一下当两个端点的时候,两端都可以流。#include<bits/stdc++.h>using namespace std;const int N=200010;typedef lon.原创 2020-10-21 22:13:42 · 257 阅读 · 0 评论 -
K - Appleman and Tree
题意:给定一棵树,将树分成k个连通块,并且每个连通块内只有一个节点的方案数。思路:这个实在是想不出来啊,标解是开个dp[u][2]数组,表示只考虑u这颗子树并且u这个节点是否在有黑棋子的连通块中的方案数。初始化就是如果黑色dp[u][1]=1,否则dp[u][0]=1;转移也很骚:枚举每个子树,由于乘法原理我们发现子树之间是相互独立的,dp[u][1]=dp[u][1](dp[j][0]+dp[j][1])+dp[u][0](dp[j][1])dp[u][0]=dp[u][0]*(dp[j.原创 2020-10-21 18:25:52 · 261 阅读 · 0 评论 -
A - Distance in Tree
题意:给你一棵树,让你记录树上两点距离为k的点对数。思路:dp[i][j]代表考虑i这颗子树,与它距离为j的点数量,dp[i][0]就是1了,然后dfs处理一下就可以,那么它就是答案的一部分,还有一部分就是把i当做中转节点,从u开始递归,枚举它的每个子树,ans+=(dp[u][tt]-dp[j][tt-1])*(dp[j][k-tt-1]),最后别忘记除以二,最后有点小疑惑,为什么这样就是答案了呢,会不会重复或者漏算呢,首先dp[i][k]加起来肯定是不重复的,然后画画图发现把u当做中转的也不会有重.原创 2020-10-21 18:16:40 · 558 阅读 · 0 评论 -
B - Zero Tree
题意:每次可以将包含1的节点的子树加1或者减1,问最小的操作数让整棵树变成0;解题思路:由于每次操作都要带上1,那么我们把1当做根节点,然后我们发现他的操作数与子树有关,先不考虑u这个节点,仅考虑他的子树,那么操作数有上升的也有下降的,那就是启发我们开两个数组,up,down记录上升的次数和下降的次数,状态方程转移:up[u]=max(up[j]),down[u]=max(down[j]),然后再考虑u这个点,先把down和up都计算到val中,如果val大于零down+=val,否则up-=val.原创 2020-10-21 18:09:04 · 375 阅读 · 0 评论 -
I - Tree with Maximum Cost
题意:选择一个点作为根节点,然后每个顶点到它的花费为距离那个顶点的值。求最大值。思路:也是树形dp,dp[i]代表考虑以i为根节点,他的子树对他的花费,sum[i]代表i整颗子树的节点个数和,那么dfs两次就行了,第一次dfs预处理出来sum和dp数组,第二次处理出每个点的答案。u节点的答案就是ans[u]=dp[u]+(all-sum[u])+ans[p]-sum[u]-dp[u]=all+ans[p]-2sum[u];AC代码:#include<bits/stdc++.h>usin.原创 2020-10-21 17:59:01 · 202 阅读 · 0 评论 -
F - Computer
题意:给定一棵树,求出每个点到树上所有点的最大距离。思路:先dfs预处理出来 考虑u这颗子树,往下走的最大值和次大值,然后每个点的最大值,来源一下面的最大值和它根节点往上走的最大值再取max,那么往上走的情况有两种例如下图:p代表u的父节点,根节点往上走的途径有两条,一条是继续往他的父节点走,就是up[j]+w[i],还有一条就是它往下走,往下走就要判断一下往下走的最大值是否经过u这个点,如果经过了就只能用次打值来更新了,否则可以用最大值。#include<bits/stdc++.h>.原创 2020-10-21 17:51:00 · 284 阅读 · 0 评论 -
2020CCPC秦皇岛 k Kingdom’s Power
题意:有无数个军队可以从树根1出发,每花费一个点可以让军队走一步,问遍历完整个树的最小花费。思路:先记录每个节点的高度,用节点根据它子树的高度的高度来排序,然后节点的高度为子树的最高高度+1,然后类似树形dp,从上往下递归h和与从下往上走的值取min。最后把所以的根节点的值加起来。#include<iostream>#include<cstring>#include<vector>#include<algorithm>using namespac.原创 2020-10-19 12:00:48 · 1164 阅读 · 0 评论 -
Acwing 1075. 数字转换
解题报告:这道题其实就是树形dp的板子题,还掺杂着一点数论的气息,如果朴素去枚举每个数的最大公约数用试除法,o(n根号n),如果n大点就不行了,可以用线性筛的思想,去枚举每个公约数,把他的>=2倍都加上它,这样做法线性On的。然后dfs任意一个节点,找最大距离就可以了。#include<iostream>#include<cstring>using names...原创 2020-04-22 20:12:12 · 372 阅读 · 0 评论 -
Maximum White Subtree
解题报告:这题感觉是树形dp,但想不出来怎么做,看了题解,题解的意思是先从根开始dfs用子树的信息更新根,f数组先定义出包括i的子树中最大的白点减去黑点,由于黑点是0我们可以把它变成-1,那么就是等价于求子树的最大和,然后递归完,除了根以外,每个点都成为过儿子节点,那么我们要考虑根节点对他的影响啦,假设 j 是 子节点 u 是根结点,如果f j 小于0 那么他不在u的最优解里,所以f j 的转移是 max(f[j],f[j]+f[u]); 如果f j 大于等于0 那么他在u的最优解里 , 那么我们要么就.原创 2020-09-02 15:01:53 · 255 阅读 · 0 评论 -
没有上司的聚会
Ural大学有N名职员,编号为1~N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 Hi给出,其中 1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。输入格式第一行一个整数N。接下来N行,第 i 行表示 ...原创 2020-03-14 12:32:44 · 230 阅读 · 0 评论 -
树形dp
实在太菜了,之前做过的模板还是给忘记了,wa10000次才刻骨铭心。#include<iostream>#include<cstring>using namespace std;const int N=200010;typedef long long ll;int h[N],ne[N],w[N],idx,e[N];int n;ll ans=-1e18;void add(int a,int b){ e[idx]=b,ne[idx]=h[a],h[a]=id.原创 2020-05-11 20:34:04 · 201 阅读 · 0 评论 -
1074. 二叉苹果树
解题报告:这道题也是树形dp题,f[i][j]代表根节点是i的情况下留j条边的最大值的方案,最后要求的是以1为根最大值为q的方案,状态转移方程就是类似于分组背包问题,先从大到小枚举体积,再枚举给子树的体积.#include<iostream>#include<cstring>using namespace std;const int N=110;int h[...原创 2020-04-22 20:29:33 · 270 阅读 · 0 评论 -
1073. 树的中心(树形dp)
大致题意:求出树上所有点的最远距离的最小值。解题思路:先找出每个点向下的最大值和最小值并且记录经过最大值的下一个节点编号,最远距离无非就是要么就是向下要么就是向上,向下的值就是d1,而向上的有两种,比如当前点是j上一个点是u,那要先加上u和j之间的距离,然后分情况,一种就是上一个点的向上最大值+这条边,另一种情况就是上一个点向下的最大值+这条边(如果经过j这个点就只能退而求其次找次大值)。两者取...原创 2020-04-19 15:56:16 · 545 阅读 · 0 评论 -
树形dp 求树的直径
题目描述:给定一棵树,树中包含 n个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值。现在请你找到树中的一条最长路径。换句话说,要找到一条路径,使得使得路径两端的点的距离最远。注意:路径中可以只包含一个点。输入格式第一行包含整数 n。接下来 n−1行,每行包含三个整数 ai,bi,ci,表示点 ai和 bi 之间存在一条权值为 ci 的边。输出格式输出一个整数,表示树的...原创 2020-04-18 23:05:30 · 480 阅读 · 3 评论 -
树形dp vector存图
There 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 forms a t...原创 2020-03-25 21:24:35 · 267 阅读 · 0 评论