
树形dp
AKone123456
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
点对最大值-----------------------------树形dp
解析:这道题相当于树的最长路径加强版.f[i]:表示以i为根的子树,到达节点i的最大值是多少初始化 f[i]=c[i];状态转移方程:f[u]=max(f[u],f[v]+w[i])解释:当前u节点的最大值,有可能就是自身,有可能是子节点+边权。所以两者取较大者即可#include<bits/stdc++.h>using namespace std;const int N=1e6+10;int e[N<<2],ne[N<<2],w[N<&l..原创 2020-06-01 16:28:32 · 181 阅读 · 0 评论 -
旅游--------------------------树形dp
解析:设f[u][0/1] 表示不选u和选u的方案数讨论一:选u,那么儿子节点v是不能选的 所以状态方程 f[u][1]+=f[v][0]讨论二:不选u,那么儿子节点v可以选,也可以不选,两者取最大 。状态方程 f[u][0]+=max(f[v][0],f[v][1])#include<bits/stdc++.h>using namespace std;typede...原创 2020-04-25 15:39:27 · 228 阅读 · 0 评论 -
牛牛染颜色---------------------------------树形dp
解析:设f[u][0/1] 表示不选择u和选择u 以u为根的子树的方案数讨论一:我们选择u节点,那么以u为根的子树内的节点随便取。因为不管你怎么取 lca(x,y)=u 都是符合题意的 状态方程就是讨论二:我们不选择u节点,那么只能选择一棵子树内的节点或者都不选。因为如果在以u为根的子树内选两点 会出现lca(x,y)=u 的情况,不满足题意。又因为每个不选择u节点的,会多一...原创 2020-04-25 11:24:30 · 229 阅读 · 0 评论 -
黑白树-----------------------------------------------树形dp
解析:染色肯定自下往上染,所以我们要从叶子结点开始染色。当一个节点染完色后,要更新父节点的染色值(因为有可能儿子节点染色值大于本身,这会让答案更优)染色值往上传递是要-1的递推方程 k[fa]=max(k[fa],k[u]-1)#include<bits/stdc++.h>using namespace std;const int N=1e5+10000;vecto...原创 2020-04-03 11:58:09 · 206 阅读 · 0 评论 -
选点---------------------------------------树形dp
解析:由题意可知,就是树的先序遍历(本题先右子树再左子树),然后求最长上升子序列(nlogn) 做法#include<bits/stdc++.h>using namespace std;const int N=1e5+1000; typedef long long ll;int l[N],r[N];int a[N],b[N],cnt;ll q[N]; ll w[N...原创 2020-03-24 23:35:48 · 170 阅读 · 0 评论 -
问题 B: 会议------------------------------思维(树的重心+dfs/bfs+套路题)
题目描述有一个村庄居住着n个村民,有n-1条路径使得这n个村民的家联通,每条路径的长度都为1。现在村长希望在某个村民家中召开一场会议,村长希望所有村民到会议地点的距离之和最小,那么村长应该要把会议地点设置在哪个村民的家中,并且这个距离总和最小是多少?若有多个节点都满足条件,则选择节点编号最小的那个点。输入第一行。一个数n,表示有n个村民。接下来n-1行,每行两个数字a和b,表示村民a的家和...原创 2020-03-22 23:56:39 · 271 阅读 · 0 评论 -
小G有一个大树------------------------------树形dp
解析:本题就是树的重心模板,只是需要多记录一个重心节点是谁#include<bits/stdc++.h>using namespace std;const int N=1e5+1000;vector<int> G[N];int f[N];//记录以u为根的节点个数 int n,a,b;int maxnode,maxsum=0x3f3f3f3f;//max...原创 2020-03-18 15:36:50 · 341 阅读 · 0 评论 -
树上子链------------------------------树形dp
给定一棵树 T ,树 T 上每个点都有一个权值。定义一颗树的子链的大小为:这个子链上所有结点的权值和 。请在树 T 中找出一条最大的子链并输出。解析:就是求树上的最长路径。设f[x]:表示到以x为根的子树的最长路径#include<bits/stdc++.h>using namespace std;const int N=1e5+1000;typedef long ...原创 2020-03-09 16:21:55 · 280 阅读 · 0 评论 -
F. Maximum White Subtree--------------------------换根dp
题意给你一棵树n个节点,每个节点要么是白色(1) 要么是黑色(0) 问每个点输出包含这个点的连通子图的的白色节点的个数黑色节点的个数最大值解析:换根dp第一次dfs:是自底向上随便找一个点作为根 这样就维护了以i为根的子树的最优解第二次dfs:是自顶向下,因为第一次我们计算出了以i为根的子树最优解,但是少了i上面那一部分的最优解所以儿子节点j的最优解就是 f[j]=max(0,...原创 2020-03-14 15:27:00 · 188 阅读 · 0 评论