树型DP

news/2025/1/16 21:50:55/文章来源:https://www.cnblogs.com/hefenghhhh/p/18675815

## 树型DP

**树型DP**,即在树上做动态规划。树是无环图,顺序可以是从叶子到根节点,也可以从根到叶子节点。一般树型DP的特征很明显,即状态可以表示为树中的节点,每个节点的状态可以由其子节点状态转移而来(从叶子到根的顺序),或是由其父亲节点转移而来(从根到叶节点的顺序),也可是两者结合。找出状态和状态转移方程仍然是树型DP的关键。 

 

### 例1:没有上司的晚会

#### 题目描述

Ural大学有$N$个职员,编号为$1 \sim N$。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数,第$i$个职员的快乐指数为$h_i$。 现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起参加宴会。

#### 数据范围 

$1 \leq N \leq 60000,  -128 \leq h_i \leq 127$ 

 

#### 分析

设$f_{i,0/1}$表示节点$i$不参加(或参加)晚会时子树$i$的最大快乐指数。

若$i$不参加,则$i$的直接下属$j$可以参加,也可以不参加。

$f_{i,0} =\sum_{j \in son_i} max(f_{j,0}, f_{j,1}$ 

若$i$参加,则$i$的直接下属$j$不能参加宴会。

$f_{i,1} = \sum_{j \in son_i} f_{j,0} + h_i$ 

叶子节点的初始状态$f_{leaf,0}=0, f_{leaf, 1}=h_{leaf}$. 

因为自下而上转移,所以可以采用记忆化搜索的方法。

```cpp

#include <bits/stdc++.h>
using namespace std;
#define maxn 60006
int n, ecnt, h[maxn], fir[maxn];
int f[maxn][2];
bool vis[maxn];
struct node{
intv,nxt;
}eds[maxn << 1];

void adde(int u, int v){
eds[++ecnt].v=u, eds[ecnt].nxt=fir[v], fir[v] =ecnt; //只保存父亲到儿子的边
}

int dfs(int r, bool flg){
if(f[r][flg] !=0xd0d0d0d0) returnf[r][flg];
if(flg==0) f[r][flg] =0;
elsef[r][flg] =h[r];
for(inti=fir[r]; i; i=eds[i].nxt){
intt=eds[i].v;
if(flg==0){
f[r][flg] +=max(dfs(t, 0), dfs(t, 1));
}
elsef[r][flg] +=dfs(t, 0);
}
returnf[r][flg];
}
int main(){
inta, b, root;
scanf("%d", &n);
for(inti=1; i<=n; i++)scanf("%d", &h[i]);
for(inti=1; i<n; i++){
scanf("%d%d", &a, &b);
adde(a, b);
vis[a] =1; 
}

for(inti=1; i<=n; i++){
if(vis[i] ==0) {root=i; break;} //找出根节点 
}
memset(f, 0xd0, sizeof f);
dfs(root, 0);
dfs(root, 1);
printf("%d\n", max(f[root][0], f[root][1]));
return0;
}
```
 
 
### 例2. 二叉苹果树
#### 题目描述 
有一棵苹果树,如果树枝有分叉,一定是分$2$叉(就是说没有只有$1$个儿子的结点) 这棵树共有$N$个结点(叶子点或者树枝分叉点),编号为$1 \sim N$,树根编号一定是$1$。 我们用一根树枝两端连接的结点的编号来描述一根树枝的位置。下面是一颗有4个树枝的树:
2   5    
 \ /  
  3   4
    \ /  
      1 
现在这颗树枝条太多了,需要剪枝。但是一些树枝上长有苹果。 给定需要保留的树枝数量,求出最多能留住多少苹果。 
#### 输入格式
第1行: 2个空格分开的整数,$N$ 和 $Q(1 \leq Q \leq N,1 \lt N \leq 100)$,$N$表示树的结点数,$Q$表示要保留的树枝数量。 接下来$N-1$ 行描述树枝的信息。
每行$3$个整数, 前两个是它连接的结点的编号。第3 个数是这根树枝上苹果的数量。 每根树枝上的苹果不超过30000 个。
 
#### 输出格式
第1行:一个整数,表示最多能留住的苹果的数量。
 
#### 分析
如果设状态$f_{i,j}$为子树$i$中包含$j$边,转移时不太自然。因为还要考虑节点$i$到儿子的边是否保留的情况。
于是,将父子边的边权下放到儿子处,设状态$f_{i,j}$表示$子树$i$包含$j$个点的最大的苹果数量。
于是得到状态转移方程为
$$f_{i,j}=\max_{k=0}^{j-1}(f_{l,k}+f_{r,j-1-k}) $$
答案为$f_{Q+1}$。因为包含$Q+1$个点时,刚好包含$Q$条边。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/870312.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MobaXterm(远程终极工具箱) v24.4汉化专业版

MobaXterm是一款集多种远程功能于一身的工具,它通过支持SSH、Telnet、RDP、VNC等协议,让用户能够轻松远程连接至不同操作系统,如Linux、Unix和Windows。此外,它还具备文件传输功能,支持SCP、SFTP、FTP协议,方便用户在本地与远程设备间传输文件。关键特性图形界面支持:可…

https证书一键自动续期,帮你解放90天限制

前言 前几天网站证书到期,发觉证书颁发每次只能90天有效期,这谁能忍受,于是乎发觉网上有免费的一键续期脚本,真正解放我们的双手。项目如下acme.sh。 期间由于"墙"的原因,踩了很多的坑,此文记录一下踩坑的过程,同时也帮助我们"墙内"的程序员,不需要…

对rpc长连接与短连接的思考

RPC项目中长连接和短连接各有优劣,长连接适用于少量客户端,提高效率;短连接则更适合大量客户端,避免服务器过载。结合L4和L7负载均衡,合理选择连接方式,提升系统性能和稳定性。对rpc长连接与短连接的思考 对于rpc项目,在接受大佬指导的时候曾问过对于长连接和短连接是如…

【Windows攻防】通过代码研究空字节和无文件方式注册表隐藏技术

这篇文章收录于《取证实录》第四季中。 注册表隐藏技术通常用于恶意软件、后门程序或攻击者企图在系统中保持隐蔽,绕过安全检查和防御系统。 常见的隐藏技术有:使用非法字符隐藏注册表项(如PlugX、TDL4/Alureon(Rootkit))、利用默认键值(空字符串)隐藏(如Adwind RAT)…

DVWA靶场学习

暴力破解Brute Force low 输入密码就正常抓包放字典破解得了uploading-image-528180.png medium 同样的操作发现响应速度变慢了,但是还是能暴力破解,不多说了。 uploading-image-408161.png 部分源码解读 $user = $_GET[username]; $user = ((isset($GLOBALS["___mysqli…

推荐几个不错的 Linux 服务器管理工具

前言 选择一款好的 Linux 服务器管理工具能够极大地提高运维效率,保障业务连续性。今天大姚给大家分享3款不错的 Linux 服务器管理工具,希望可以帮助到有需要的同学。 1Panel 1Panel是新一代的 Linux 服务器运维管理面板,旨在通过现代化的 Web 界面帮助用户轻松管理 Linux 服…

学习进度笔记⑩

Tensorflow线性回归 源代码:import tensorflow as tfimport numpy as npimport matplotlib.pyplot as pltimport osos.environ["CUDA_VISIBLE_DEVICES"]="0"#设置训练参数,learning_rate=0.01,training_epochs=1000,display_step=50learning_rate=0.01…

学习进度笔记⑨

tensorflow基本操作(类似numpy) 源代码import tensorflow as tf import os os.environ["CUDA_VISIBLE_DEVICES"]="0" #构造计算图,创建两个常量节点a,b,值分别为2,3 a=tf.constant(2) b=tf.constant(3) #创建一个Session会话对象,调用run方法,运行…

利用AI大模型实现个性化视频配音

最近,作者决定拍摄短视频分享AI技术的应用,并遇到了配音问题。由于家中环境嘈杂且设备不够专业,作者尝试了机器配音,但效果不佳。作者转而想到AI大模型支持语音识别,于是开始寻找语音合成模型。最终在阿里云百炼平台上找到了通义千问-语音合成CosyVoice大模型,多个音色都…

【取证工具】Magnet AXIOM中文绿色版(更新8.4)

Magnet AXIOM取证工具介绍 Magnet AXIOM 是一款功能强大的数字取证工具,专为法律执行人员、调查员和安全专家设计,用于从各种数字设备中提取、分析和报告证据。AXIOM 提供了全面的取证支持,能够从电脑、移动设备、云端服务以及物联网设备中收集并分析数据。多平台支持 Magne…

介绍1个简单好用的英文文本翻转网站,关键还免费不用登录

输入英文,会 生成对应的翻转、反向、镜像、𝕆𝕦𝕥𝕝𝕚𝕟𝕖 𝔽𝕠𝕟𝕥、𝓒𝓾𝓻𝓼𝓲𝓿𝓮 𝓛𝓮𝓽𝓽𝓮𝓻𝓼的文本可以用于生成密码,聊天时发消息,猜字符的场景,欢迎使用和访问,简单免费,无需登录 比如你想她啦,不好意思说…

[Babel] Intro Babel - 01 Introduction

Babel介绍 Babel 是一个编译器,主要用于将最新的 JavaScript 代码转化为向后兼容的代码,以便在老版本的浏览器或环境中运行。 例如,你可能在开发时使用了 ES6、ES7 或者更高级的 JavaScript 特性,但是有些浏览器可能并不支持这些新特性,这时就可以用 Babel 来将代码转化为…