树形DP学习总结
学完换根不久后发现不太熟了,赶紧写篇总结复习一下
\(\\\\\)
树形DP,即在树上进行DP的操作。
例题1:luogu P1352 没有上司的舞会
题目描述
某大学有 \(n\) 个职员,编号为 \(1\ldots n\)。
他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。
现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数 \(r_i\),但是呢,如果某个职员的直接上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。
所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。
输入格式
输入的第一行是一个整数 \(n\)。
第 \(2\) 到第 \((n + 1)\) 行,每行一个整数,第 \((i+1)\) 行的整数表示 \(i\) 号职员的快乐指数 \(r_i\)。
第 \((n + 2)\) 到第 \(2n\) 行,每行输入一对整数 \(l, k\),代表 \(k\) 是 \(l\) 的直接上司。
输出格式
输出一行一个整数代表最大的快乐指数。
样例 #1
样例输入 #1
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5
样例输出 #1
5
提示
数据规模与约定
对于 \(100\%\) 的数据,保证 \(1\leq n \leq 6 \times 10^3\),\(-128 \leq r_i\leq 127\),\(1 \leq l, k \leq n\),且给出的关系一定是一棵树。
分析
这是一道树形DP的经典题,如果一个人的上司去了舞会那么他就不能去。
按照DP的经典套路分析:
定义状态:
\(dp_{i,0/1}\):表示以\(i\)为根的子树,\(i\)不去或去舞会能获得的最大价值
答案:
由于题目没有给出根节点,所以根节点要自己找,答案是\(\max(dp_{root,0},dp_{root,1})\)
状态转移方程
对于每个\(x\),有\(x\)是\(v\)的父亲,即\(x\to v\)。
对于每个\(dp_x\):
若\(x\)要去舞会,则他的每个儿子都不能去舞会,所以得出\(dp_{x,1}=\sum dp_{v,0}\)
若\(x\)不去舞会,则他的每个儿子可以去也可以不去,选最大的一个,所以得出\(dp_{x,0}=\sum (\max(dp_{v,0},dp_{v,1}))\)
边界条件:
因为如果\(x\)去舞会,则肯定会有\(r_x\)的价值
所以\(dp_{x,1}=r_x\)。
那么代码实际上就只要在DFS整颗树的时候进行转移就好了。
Code:
Upd:里面有两个地方写错了,找一找吧。
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
using namespace std;
const int maxn=1e6+5;
int n,a[maxn],dp[maxn][2],r[maxn],vis[maxn];
vector<int>vt[maxn];
void dfs(int x){
dp[x][1]=r[x];
for(auto v:vt[x]){
dp[x][1]+=dp[v][0];
dp[x][0]+=max(dp[v][0],dp[v][1]);
dfs(v);
}
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>r[i];
}
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
vt[v].push_back(u);
vis[v]=1;
}
for(int i=1;i<=n;i++){
if(vis[i]==0){
dfs(i);
cout<<max(dp[i][0],dp[i][1]);
return 0;
}
}
return 0;
}
刚才写的题实际上是第一类树形DP,即兄弟节点之间没有约束条件,而一会要讲的就是第二类树形DP,即树上背包,兄弟节点之间有约束关系。
树形DP学习总结的更多相关文章
- 树形DP 学习笔记
树形DP学习笔记 ps: 本文内容与蓝书一致 树的重心 概念: 一颗树中的一个节点其最大子树的节点树最小 解法:对与每个节点求他儿子的\(size\) ,上方子树的节点个数为\(n-size_u\) ...
- 树形dp学习
学习博客:https://www.cnblogs.com/qq936584671/p/10274268.html 树的性质:n个点,n-1条边,任意两个点之间只存在一条路径,可以人为设置根节点,对于任 ...
- 树形$dp$学习笔记
今天学习了树形\(dp\),一开始浏览各大\(blog\),发现都\(TM\)是题,连个入门的\(blog\)都没有,体验极差.所以我立志要写一篇可以让初学树形\(dp\)的童鞋快速入门. 树形\(d ...
- 树形DP学习笔记
树形DP 入门模板题 poj P2342 大意就是一群职员之间有上下级关系,每个职员有一个快乐值,但是只有在他的直接上级不在场的情况下才会快乐.求举行一场聚会的快乐值之和的最大值. 求解 声明一个数组 ...
- 树形DP 学习笔记(树形DP、树的直径、树的重心)
前言:寒假讲过树形DP,这次再复习一下. -------------- 基本的树形DP 实现形式 树形DP的主要实现形式是$dfs$.这是因为树的特殊结构决定的——只有确定了儿子,才能决定父亲.划分阶 ...
- 树形dp|无根树转有根树|2015年蓝桥杯生命之树
2015年蓝桥杯第十题--生命之树(无根树dfs) ①暴力解法:枚举子集(选点) + dfs判断连通性(题目要求连通)满足上面两个条件下找出最大值权值和 ②dfs无根树转有根树,递归找最优 先学习无根 ...
- 树形DP入门学习
这里是学习韦神的6道入门树形dp进行入门,本来应放在day12&&13里,但感觉这个应该单独放出来好点. 这里大部分题目都是参考的韦神的思想. A - Anniversary part ...
- [学习笔记]树形dp
最近几天学了一下树形\(dp\) 其实早就学过了 来提高一下打开树形\(dp\)的姿势. 1.没有上司的晚会 我的人生第一道树形\(dp\),其实就是两种情况: \(dp[i][1]\)表示第i个人来 ...
- 学习笔记——树形dp
树形 dp 介绍 概念 树形 dp,顾名思义,就是在树上做 dp,将 dp 的思想建立在树状结构之上. 常见的树形 dp 有两种转移方向: 从叶节点向根节点转移,这种也是树形 dp 中较为常见的一种. ...
- bzoj2500: 幸福的道路(树形dp+单调队列)
好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...
随机推荐
- DeepSeek+AnythingLLM打造自己大模型知识库
DeepSeek+AnythingLLM打造自己大模型知识库 目 录 1. 安装Ollama 2. 下载DeepSeek模型 3. 安装AnythingLLM ...
- Project Euler 638 题解
q-analog,老玩家集体起立! 这也就是说: \[\binom{n+m}{n}_q=\sum_{\pi\in L_{n,m}}q^{area(\pi)} \] 结束! #include<bi ...
- MAC消息认证码介绍
此MAC是密码学概念,与计算机网络不同 为什么有了摘要算法还要有MAC 摘要算法保障的是消息的完整性 归根到底就是由H(x)来保证x的完整 那么问题来了,如果我知道你所使用的摘要算法(例如中间人攻击) ...
- 并发编程 - 线程同步(九)之信号量Semaphore
前面对自旋锁SpinLock进行了详细学习,今天我们将学习另一个种同步机制--信号量Semaphore. 01.信号量是什么? 在 C# 中,信号量(Semaphore)是一种用于线程同步的机制,能够 ...
- CF1837E Play Fixing 题解
首先来考虑什么情况方案数为 \(0\): 可以确定,在某一层中,两个原本都能晋级的队伍比赛: 可以确定,在某一层中,两个原本都不能晋级的队伍比赛. 发现假如写出每一场比赛及其胜者,可以形成一棵树形结构 ...
- MySQL 查询时间
mysql 查询当天.最近一天.最近一周,本月,上一个月的数据 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT ...
- 【BUUCTF】Hack World 1
[BUUCTF]Blacklist (SQL盲注) 题目来源 收录于:BUUCTF CISCN2019 华北赛区 Day2 Web1 题目描述 纯粹的SQL注入题 当输入1时,返回字符串:Hello, ...
- Opencv | 图形学 | Mingw64 | 如何正确地用MinGW64编译与配置vscode的Opencv环境
如何正确地用MinGW64编译与配置vscode的Opencv环境 1.前情提要 最近有关于图形学的授课,教授开始布置的上机打码的代码实现作业了.虽说教授为了让我们省心,直接就整了个环境已经配置好的几 ...
- Python基础笔记-Python基础知识(环境、Python解释器、环境变量、基础语法、数据类型等)
前言 !!!注意:本系列所写的文章全部是学习笔记,来自于观看视频的笔记记录,防止丢失.观看的视频笔记来自于:哔哩哔哩武沛齐老师的视频:2022 Python的web开发(完整版) 入门全套教程,零基础 ...
- Abaqus压电材料分析
目录 1. ABAQUS压电材料定义[快速版] 2. 压电材料的主要特性参数 3. Abaqus 压电分析 1 电响应 2 initial condition & BCs 4 Load 5 M ...