首页 > 其他分享 >树型DP

树型DP

时间:2025-01-16 21:53:56浏览次数:1  
标签:int 树枝 #### leq DP 树型 节点 flg

## 树型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$条边。

标签:int,树枝,####,leq,DP,树型,节点,flg
From: https://www.cnblogs.com/hefenghhhh/p/18675815

相关文章

  • LeetCode | 图文详细描述动态规划DP算法及经典题型
    本文将用简单直白的方式,从零开始带你掌握动态规划的精髓。你会发现:动态规划其实没那么难——它就是递归的“记性”版。状态转移方程不再玄学——从题目思路到实现,手把手教你推导。经典题型剖析——从“爬楼梯”到“背包问题”,全都有图、有代码、有思路。看完这篇文章,动态规划......
  • wordpress 从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新
    两种报错方式:1.此响应不是合法的JSON响应。2.从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页。情况:媒体服务器上传小文件没问题,大一点的文件报这个错误。原因:这是因为nginx限制了请求体大小方案:需要在nginx的虚拟机配置文件中添加:client_max_b......
  • 基于C语言实现UDP服务器
    UDP(UserDatagramProtocol,用户数据报协议)是一种无连接的传输层协议,适用于对实时性有较高要求的应用场景,如视频流传输、语音通信、在线游戏等。与TCP不同,UDP不保证数据的可靠性和顺序性,但其传输速度较快。本文将介绍如何使用C语言编写一个简单的UDP服务器程序,以及如何接收和处理......
  • GDPR——DPIA
    GDPR发布以后,DPIA(DataProtectionImpactAssessment)是数据控制者DataController必须履行的一项安全职责(详见GDPR第35条)。一、触发的时机:DPIA应当前置评估,在如下这些场景实施前:使用新技术:Ifyou’reusingnewtechnologies处理地理位置和行为信息(地理位置很容易理解,行......
  • 【Windows安全】日志分析:RDP暴力破解
    #应急响应免责声明:请勿使用本文中提到的技术进行非法测试或行为。使用本文中提供的信息或工具所造成的任何后果和损失由使用者自行承担,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。暴力破解是一种通过穷举所有可能的密码或密钥组合来突破身份验证或加密保......
  • wordpress的火车头商品发布接口
    <?phprequire'../wp-load.php';ini_set('memory_limit','1024M');set_time_limit(180);$top_cat='';#图片链接域名替换$image_host='';$start_time=microtime(true);$counter=0;//临时缓存$products=$sk......
  • 为WordPress网站设置第三方社交软件登录
    1.下载SuperSocializer外挂,为WordPress网站设置第三方社交软件登录由于wordpress配置的数据库是本地专用的,所以用户如果使用我们搭建的网站可能需要重新登陆,这无疑会是我们网站登录方面的痛点,所以使用第三方社交软件账号登录会很方便。2.使用域名登录网站昨天搭建网站的时候,使......
  • 插头DP记录
    AAA黑题批发。这个东西好像设问还挺广泛的,做到哪写到哪吧。得先了解一下轮廓线dp定义。概念设问广泛但是总体来说是连通性相关状压dp的一类设计方法。骨牌覆盖问题比如说,最简单的,问你\(n*m\)的棋盘格里能放多少\(1*2\)的骨牌。考虑把一个节点分为上下左右四个插头,从上......
  • 字符串dp+匹配
    https://codeforces.com/problemset/problem/2050/E#include<bits/stdc++.h>usingnamespacestd;#defineendl'\n'usingll=longlong;usingpii=pair<char,int>;constdoublePI=acos(-1);constintN=1e3+10;constintmod=1e9......
  • Sigrity System SI SerialLink模式进行USB3.1协议仿真分析操作指导-SuperSpeedPlus_Rx
    SigritySystemSISerialLink模式进行USB3.1协议仿真分析操作指导-SuperSpeedPlus_Rx_HostSigritySystemSISerialLink模式提供了10个协议合规性检查工具模板,用户可以将根据实际应用替换模板中的SPICE文件,然后进行协议仿真分析,同时软件还提供了目标结果的模板MASK以及该协......