简单了解树形DP
今天在B站看了一个树形DP教学视频有所收获,做一个小小的总结
AV号和链接在这:av12194537
那么先介绍一下树形DP
树形DP就是在树这个特殊的数据结构上进行的DP。有两种方向:自顶向下和自底向上。
树形DP运用了DFS的方式。
一般来说都是用自底向上的方向,也就是从叶子节点到根节点。如果采用自顶向下的方式,那么要先进行一遍自顶向下的DFS(预处理),再由根节点到叶子结点获取想要的答案。
用一个经典入门题讲解一下:没有上司的舞会
题目大意就是给一棵树每个节点给定一个价值,子节点和父节点不能同时选取,求能够选取的最大价值。
我们用dp[u][0]表示不选取u节点u子树(包括u在内)能获得的最大价值,dp[u][1]表示选取u节点u子树(包括u在内)能获得的最大价值。
w[u]表示单个u节点的价值。
我们从根节点开始进行DFS遍历,遍历完整棵树以后回溯的同时就开始自底向上获取答案。对于任意一个节点u,要得到它的包括自身的子树的价值的最大值,这个最大值需要记录两个,一个是选了自身,一个是没选自身,也就是dp[u][1]和dp[u][0]。如果没有选自身,那么每个子节点都可选可不选,u的最大值就加上每个子节点选和不选的两个最大值中较大的那个,等于Σ(max(dp[vi][0], dp[vi][1]))(vi是u的第i个字节点)。状态转移方程就是 dp[u][0] += max(dp[v][0], dp[v][1]);而如果选了u节点自身,那么它所有的子节点都不能选,最大值就等于Σ(dp[v][0]),转态转移方程就是 dp[u][1] += dp[v][0];
最后只要比较根节点的两个最大值,大的那个就是想要的结果。
上代码:
void Dfs(int u)
{
dp[u][] = ;
dp[u][] = w[u];
for(int v:e[u]) //用v代表根节点
{
Dfs(v);//因为要从叶子节点自底向上,所以先遍历一遍所有节点
dp[u][] += max(dp[v][], dp[v][]);
//不选u节点的话子节点v可选可不选
dp[u][] += dp[v][];
//选u节点的话字节点v只能不选
}
} int main()
{
...
Dfs(root);//从根节点开始DFS;
maxvalue = max(dp[root][], dp[root][]);
//最后比较选根节点和不选根节点哪个大
...
return ;
}
简单了解树形DP的更多相关文章
- P3565 由简单的树形dp 引入 长链刨分
这道题感觉不太行 因为自己没想出来. 先说一下暴力吧,取三个点 让两两之间的距离相等怎么做呢,看起来是很复杂的样子的,但是仔细观察发现 答案出自一个点的儿子之间 或者儿子和父亲之间. 暴力枚举三个点然 ...
- URAL 1108 简单的树形dp背包问题
题目大意: 一颗苹果树上,每条边都对应了一个权值,最后留下包括root : 1在的含有 m 条边的子树 , 希望留下的子树中权值之和最大 这里保留m条边,我们可以看作是保留了 m + 1 个点 令dp ...
- poj 2342 Anniversary party 简单树形dp
Anniversary party Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3862 Accepted: 2171 ...
- [Luogu P1122]最大子树和 (简单树形DP)
题面 传送门:https://www.luogu.org/problemnew/show/P1122 Solution 这是一道简单的树形DP题. 首先,我们可以转换一下题面,可以发现,题目要求我们求 ...
- 【BZOJ-1369】Gem 树形DP
1369: [Baltic2003]Gem Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 282 Solved: 180[Submit][Status] ...
- URAL1018 Binary Apple Tree(树形DP)
题目大概说一棵n结点二叉苹果树,n-1个分支,每个分支各有苹果,1是根,要删掉若干个分支,保留q个分支,问最多能保留几个苹果. 挺简单的树形DP,因为是二叉树,都不需要树上背包什么的. dp[u][k ...
- POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题
一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...
- rivers ioi2005 树形dp
说句实话,写完这道题,很想吐一口血出来,以示我心情的糟糕: 题目很简单,树形dp,正常做30分钟,硬是做了好几个小时,真是伤心. 题解不写了,只是吐个槽,网上没有用背包写的dp,全是左儿子右兄弟写法, ...
- HDU5739 Fantasia 树形dp + 点双缩点
这个题当时打多校的时候有思路,但是代码能力差,没有写出来 事后看zimpha巨巨的题解,看了觉得基本差不多 核心思路:就是找出割点,然后变成森林,然后树形dp就可以搞了 关键就在重新构图上,缩完点以后 ...
随机推荐
- Linux 下Nginx 运行Vue
首相基础的安装Node.js npm 先建个目录把 /node/www 然后在这个目录下 wget https://nodejs.org/dist/v8.11.1/node-v8.11.1-linu ...
- 使用百度翻译的API接口
http://api.fanyi.baidu.com/api/trans/product/desktop 这是申请的接口地址,会得到一个APPID和一个钥密 然后下载PHP的对应的代码 有一个PHP文 ...
- 819. Most Common Word 统计高频词(暂未被禁止)
[抄题]: Given a paragraph and a list of banned words, return the most frequent word that is not in the ...
- 2-python代码坑点
#切片: # L = ['aaa', 'bbb', 'ccc', 'ddd'] # print(L[1 : 3]) #取[1, 3):下标 # L = list(range(100)) # print ...
- javascript DES加密
研究联通wifi登陆中,发现了一个名为"encryption.js"的文件.这个文件一看即知是加密过的,首先自己尝试去手工解密,看到太烦琐了,忽然想到网上有js解密工具,遂决定用来 ...
- 数字图像处理实验(9):PROJECT 04-05,Correlation in the Frequency Domain 标签: 图像处理MATLAB 2017-05-25 10:14
实验要求: Objective: To know how to implement correlation of 2 functions in the frequency domain and, us ...
- 487C Prefix Product Sequence
传送门 题目大意 分析 因为n为质数所以i-1的逆元唯一 因此ai唯一 代码 #include<iostream> #include<cstdio> #include<c ...
- Luogu 2704 [NOI2001]炮兵阵地
唔,想到了状压之后就不会了……实在是菜 考虑压两行,设$f_{i, j, k}$表示当前到第$i$行,上一行是$j$状态,前一行是$k$状态的最多能放的炮兵的数量. 发现第一维还可以滚掉,好像可以转移 ...
- lambda,map,filter,reduce
lambda 编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数.返回一个函数对象. func = lambda x,y:x+y fu ...
- 组合(Composite)模式 *
组合(Composite)模式:将对象组合树形结构以表示‘部分-整体’的层次结构. 组合模式使得用户对单个对象和组合对象具有一致性 /* * 抽象构件(Component)角色:这是一个抽象角色,它给 ...