简单了解树形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就可以搞了 关键就在重新构图上,缩完点以后 ...
随机推荐
- JavaWeb之JSP入门
JSP原理及执行过程 流程图分析 用户发起请求,用户通过浏览器访问jsp页面,浏览器将HTTP协议的请求部分发送到服务端. 服务端获取请求部分,分析请求,发现本次的请求的的是jsp页面,jsp引擎按照 ...
- libevent源码深度剖析五
libevent源码深度剖析五 ——libevent的核心:事件event 张亮 对事件处理流程有了高层的认识后,本节将详细介绍libevent的核心结构event,以及libevent对event的 ...
- ubuntu安装软件包apt-get和dpkg方法
1apt方法 安装软件 apt-get install softname1 softname2 softname3…… 卸载软件 apt-get remove softname1 softname2 ...
- Django框架 之 跨域请求伪造
Django框架 之 跨域请求伪造 浏览目录 同源策略与Jsonp 同源策略 Jsonp jQuery对JSONP的实现 CORS 简介 两种请求 同源策略与Jsonp 同源策略 同源策略(Same ...
- XMLHttpRequest实现Ajax异步请求
一.XMLHttpRequest的方法 方法 描述 abort() ...
- hdu 4277 USACO ORZ (Dfs)
题意: 给你n个数,要你用光所有数字组成一个三角形,问能组成多少种不同的三角形 时间分析: 3^15左右 #include<stdio.h> #include<set> usi ...
- CSRF漏洞详细说明
CSRF漏洞详细说明 通常情况下,有三种方法被广泛用来防御CSRF攻击:验证token,验证HTTP请求的Referer,还有验证XMLHttpRequests里的自定义header.鉴于种种原因,这 ...
- DateType--字符类型
--=====================================================字符集 ASCII (American Standard Code for Informa ...
- 余额宝 vs. P2P网贷,谁更有生命力?
余额宝跟P2P网贷作为一个理财方式,要说谁更有生命力,那就必须从以下几个方面说起,一是收益性,二是风险性,三是流动性,下面从这几个方面来对比一下余额宝跟P2P网贷. 首先是收益性,作为投资理财者,第一 ...
- 百度地图离线API及地图数据下载工具
全面介绍,请看下列介绍地址,改写目前最新版本的百度V2.0地图,已全面实现离线操作,能到达在线功能的95%以上 http://api.jjszd.com:8081/apituiguang/gistg. ...