今天在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的更多相关文章

  1. P3565 由简单的树形dp 引入 长链刨分

    这道题感觉不太行 因为自己没想出来. 先说一下暴力吧,取三个点 让两两之间的距离相等怎么做呢,看起来是很复杂的样子的,但是仔细观察发现 答案出自一个点的儿子之间 或者儿子和父亲之间. 暴力枚举三个点然 ...

  2. URAL 1108 简单的树形dp背包问题

    题目大意: 一颗苹果树上,每条边都对应了一个权值,最后留下包括root : 1在的含有 m 条边的子树 , 希望留下的子树中权值之和最大 这里保留m条边,我们可以看作是保留了 m + 1 个点 令dp ...

  3. poj 2342 Anniversary party 简单树形dp

    Anniversary party Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3862   Accepted: 2171 ...

  4. [Luogu P1122]最大子树和 (简单树形DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P1122 Solution 这是一道简单的树形DP题. 首先,我们可以转换一下题面,可以发现,题目要求我们求 ...

  5. 【BZOJ-1369】Gem 树形DP

    1369: [Baltic2003]Gem Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 282  Solved: 180[Submit][Status] ...

  6. URAL1018 Binary Apple Tree(树形DP)

    题目大概说一棵n结点二叉苹果树,n-1个分支,每个分支各有苹果,1是根,要删掉若干个分支,保留q个分支,问最多能保留几个苹果. 挺简单的树形DP,因为是二叉树,都不需要树上背包什么的. dp[u][k ...

  7. POJ 2342 &&HDU 1520 Anniversary party 树形DP 水题

    一个公司的职员是分级制度的,所有员工刚好是一个树形结构,现在公司要举办一个聚会,邀请部分职员来参加. 要求: 1.为了聚会有趣,若邀请了一个职员,则该职员的直接上级(即父节点)和直接下级(即儿子节点) ...

  8. rivers ioi2005 树形dp

    说句实话,写完这道题,很想吐一口血出来,以示我心情的糟糕: 题目很简单,树形dp,正常做30分钟,硬是做了好几个小时,真是伤心. 题解不写了,只是吐个槽,网上没有用背包写的dp,全是左儿子右兄弟写法, ...

  9. HDU5739 Fantasia 树形dp + 点双缩点

    这个题当时打多校的时候有思路,但是代码能力差,没有写出来 事后看zimpha巨巨的题解,看了觉得基本差不多 核心思路:就是找出割点,然后变成森林,然后树形dp就可以搞了 关键就在重新构图上,缩完点以后 ...

随机推荐

  1. day18-事务与连接池 1.复习

    实际开发中事务必须得用.

  2. Codeforces 1120D (树形DP 或 最小生成树)

    题意看这篇博客:https://blog.csdn.net/dreaming__ldx/article/details/88418543 思路看这篇:https://blog.csdn.net/cor ...

  3. ROS naviagtion analysis: costmap_2d--LayeredCostmap

    博客转自:https://blog.csdn.net/u013158492/article/details/50490490 在数据成员中,有两个重要的变量:Costmap2D costmap_和 s ...

  4. Apache htpasswd命令

    一.简介 htpasswd是apache的一个工具,该工具主要用于建立和更新存储用户名.密码的文本文件,主要用于对基于http用户的认证. 二.语法 Usage: htpasswd [-cimBdps ...

  5. Entity Framework 6.0 Tutorials(2):Async query and Save

    Async query and Save: You can take advantage of asynchronous execution of .Net 4.5 with Entity Frame ...

  6. 《the art of software testing》 第三章 人工测试

    在深入研究较为传统的计算机测试技术之前,要先进行"人工测试". 代码检查与走查是两种主要的人工测试方法. 代码检查与走查是对过去桌面检查过程(在提交测试前由程序员阅读自己程序的过程 ...

  7. [GO]数组的比较和赋值

    package main import "fmt" func main() { //支持比较,只支持==或!=,比较是不是每一个元素都一样,2个数据比较,数据类型要一样 a := ...

  8. ORCHARD学习教程-安装

    安装说明:测试对象为正式版1.8 安装方法: 使用Microsoft Web Platform Installer 利用Microsoft WebMatrix 来安装 Working with Orc ...

  9. MongoDB整理笔记のSharding分片

    这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在sharding 的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式MongoDB 集群.MongoDB 的数据分块称为 chu ...

  10. Visual Assist X破解安装及设置

    本文提供的插件版本为Visual Assist X 10.9.2248,支持Visual Studio 2010~2017各版本,本人亲测均可正常使用. 一. 插件下载: 点击下载链接,找到对应软件下 ...