
树形DP
文章平均质量分 54
动态规划---树形DP
(xsj)
模拟只会猜题意
贪心只能过样例
DP一般看规律
数论只会gcd
计算几何瞎暴力
图论只会匈牙利
数据结构没学过
字符串只能干输入
展开
-
codeforces 1529 C.Parsa‘s Humongous Tree
题面题意给出一颗n个节点的树,每个节点的值有一个区间范围,问如何选取节点的值才能使这颗树变成完美的树,完美的树满足每条边所连接的两个节点的差值的绝对值之和最大题解(树形DP)我们知道,要想使两个节点的差值绝对值最大,那么这两个节点一定是去边界值,那么就变成了每个节点选左边界还是有边界f [u] [0] : 表示 u 节点取左边界的值f [u] [1] : 表示 u 节点取有边界的值建树后,直接从根节点开始dfs即可代码#include<bits/stdc++.h原创 2021-06-02 20:19:57 · 225 阅读 · 0 评论 -
acwing 1220 生命之树 (树形DP)
题面题解代码#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const int N = 1e5 + 10, M = N * 2;int n;ll w[N];ll h[N], e[M], ne[M], idx;l原创 2021-05-17 10:54:47 · 177 阅读 · 0 评论 -
acwing 1077 皇宫看守
题面题解(树形DP+状态机模型)此题与战略游戏的区别 : 战略游戏是有关边的,每个节点选或者不选,因为要求每条边至少有一个点,所以可以通过父节点来维护出子节点选或者不选,但是这个题是点之间的关系,不能通过父节点来维护出子节点的之间的关系,举个例子,图中2号节点不选,那么对于战略游戏这道题来说,可以确定它的儿子5号点就必须选,但是此题,2号节点不选,5号节点也可以不选,因为5号节点可以通过选8号节点来看到,2号节点可以通过选1号节点来看到f[i][0] : 在点 i 不摆放警卫,且被父结点看到原创 2021-04-10 11:06:14 · 130 阅读 · 0 评论 -
acwing 323 战略游戏
题面题解(树形DP)树形DP,可以对比没有上司的舞会这题,没有上司的舞会是要求父子节点不能同时出现,就相当于每条边上最多选一个节点,求最大权值,此题是要求每条边上最少选一个节点,求最小权值f[u] [0] : 所有以 u 为根节点的子树中,并且不选 u 的方案f[u] [1] : 所有以 u 为根节点的子树中,并且选 u 的方案题中要求每条边必须有一个节点,所以如果我们没有选 u 节点,那么连接它的所有子节点都有选,才能保证每条边至少有一个点 f[u][0] = (f[son1] [原创 2021-04-10 08:23:29 · 179 阅读 · 0 评论 -
acwing 1074 二叉苹果树
题面题解树形DP+分组背包,是有依赖背包那道题的简化版,书上的苹果树就是边的权值,树的分枝就是背包的体积f[u] [j] : 表示所有以u为根节点的子树中选,选 j 条边的最大价值以u为根节点的每一颗子树都可以看作是一组背包,若需要选择改子树son,则根节点u到子树son的边一定有,因此背包的体积首先应-1,总共可以选择j条边时,当前子树son分配到的只有j-1条边,对于任意一颗子树,都有f[u] [j] =max(f[u][j], f[u][j - 1 - k] + f[原创 2021-04-09 17:12:28 · 193 阅读 · 0 评论 -
acwing 10 有依赖的背包问题
题面题解这道题其实更偏向于树形DP,我们设状态方程 f[u] [j] 表示所有以从根节点为 u 的子树中选,体积不超过 j 的最大方案 ,那么最终 f[root][m] 就表示从根节点开始体积不超过m的最大方案要想算出祖宗节点的的最大方案,我们就要算出 f[x] [0-m] 和 f[u] [0-m] 的值,然后再更新 f [anser] [m] ,所以我们要从下往上求解代码#include<iostream>#include<cstdio>#includ原创 2021-03-31 11:17:45 · 160 阅读 · 0 评论 -
acwing 1075 数字转换 (树形DP)
题面题解首先,对于小于n的每个数,我们可以确定它的约数之和(不包括自己)是固定的,就像4的约数之和一定是3,不可能是其他的,那么我们就可以将2-n的每个数的约数之和求出sum[i],对于sum[i]<i 的我们连一条sum[i]---->i 的边(因为对于每个i,sum[i]是唯一确定的),也就是说每个儿子都有唯一一个父节点,那么我们最终就会构成森林(多课树),题中找最长的变换步骤就转换成了求树的最长直径为什么不从1开始 ,因为1除本身外约数之和就是0,题中要求最小为1,所以原创 2021-03-13 14:36:58 · 183 阅读 · 0 评论 -
acwing 1073 树的中心 (树形DP)
题面题解我们要枚举每个点到其它点的最远距离,那么就会有两种情况,向上走或者是向下走假设我们枚举u点,向下走 dfs_down(u) 更新当前节点向下走,叶子节点不需要更新d1[u] 表示 u点向下的最长路径,d2[u] 表示 u 点向下的次长路径 ,p1[u] 表示 u 的向下最长路径经过的子节点 。 那么我们只要每次枚举u节点的儿子,然后更新即可向上走:dfs_up 传入 u 节点, 我们更新它的每一个儿子(因为开始传入的u是根节点不需要向上更新)对于u的儿子 j ,第一步肯定原创 2021-03-13 10:04:02 · 174 阅读 · 0 评论 -
acwing 1072 树的最长路径 (树形DP)
题面题解对于没有边权的树的直径的定义是路径上经过的边数最多代码原创 2021-03-12 16:55:42 · 210 阅读 · 0 评论 -
算法竞赛进阶指南---0x54(树形DP)没有上司的舞会
题面题解经典的树形DP问题:我们知道,一棵树的父亲和儿子节点不能同时出现,那么我们就可以得到两个状态,选这个父节点和不选这个父节点f[u][0] : 所有以u为根的子树中选择,并且不选u这个点的方案f[u][1] : 所有以u为根的子树中选择,并且选u这个点的方案对于 f[u][0] 不选这个节点 ,那么我们就有两种选择,它的所有子节点可以选也可以不选 ,那么从这两种情况选一个最大的即可 f[u][0]=∑max(f[si,0],f[si,1])对于 f[u][原创 2021-03-11 20:51:41 · 372 阅读 · 0 评论