树形dp总结
这类题型在 dp 中很常见,于是做一个总结吧!!!
最经典的题:没有上司的舞会
传送门:没有上司的舞会 - 洛谷
状态表示:
dp[i][0] 为 以 i 为根的子树中,选择 i 节点的最大欢乐值
dp[i][1] 为 以 i 为根的子树中,不选择 i 节点的最大欢乐值
状态转移方程 dp[i][0] += dp[[j][1] dp[i][1] += dp[j][0] j 为 i 的子节点
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 6e3 + 10;
int a[N];
int h[N], e[N], ne[N], idx;
bool flag[N] = { 0 };
int f[N][2];
void add(int a, int b)
{e[idx] = b;ne[idx] = h[a];h[a] = idx++;
}
void dfs(int u , int fa ) // 树形 dp 中一般都是用 dfs
{for (int i = h[u]; i != -1; i = ne[i]){int j = e[i];dfs(j, u);f[u][0] += max(f[j][0] , f[j][1] );f[u][1] += f[j][0];}
}
void solve()
{memset(h, -1, sizeof h);int n; cin >> n;for (int i = 1; i <= n; i++) cin >> a[i];for (int i = 1; i < n; i++){int a, b;cin >> a >> b;add(b, a);flag[a] = true;}int root = -1;for (int i = 1; i <= n; i++){f[i][1] += a[i];if (!flag[i]) root = i;}dfs(root, -1 );cout << max (f[root][1], f[root][0]) << endl;
}
signed main()
{int tt = 1;while (tt--)solve();return 0;
}
再来一道经典题目:选课 (树形dp 点)
传送门:[CTSC1997] 选课 - 洛谷
状态表示:
dp[i][[j] 以 i 为根的子树中,选择 j 个节点的最大学分
状态转移方程:
dp[i][j] = dp[i][j - k] + dp[t][k] ( t 为 j 的子节点 ,k 是从子树中选择 k 个节点 )
注意:
1.你要统计子树中节点的个数
2. 需要假设一个虚拟源节点,因此要把 m++
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 620;
int f[N][N]; int n, m;
int h[N], e[N], ne[N], idx, score[N];
int Size[N];
void add(int a, int b)
{e[idx] = b; ne[idx] = h[a]; h[a] = idx++;
}
void dfs(int u, int fa)
{Size[u] += 1;f[u][1] += score[u];for (int i = h[u]; i != -1; i = ne[i]){int j = e[i];if (j == fa)continue;dfs(j, u);Size[u] += Size[j];for (int t = min(m, Size[u]); t; t--) // 注意 t 要从大到小遍历// 如果 t 要从小到大遍历,就会导致当 t 变大时,更新最新状态时,会用到这个子树刚刚更新的状态{for (int k = min(Size[j], t - 1); k >= 0; k--){f[u][t] = max(f[u][t], f[u][t - k ] + f[j][k] );}}}
}
signed main()
{memset(h, -1, sizeof h);cin >> n >> m;m++;for (int i = 1; i <= n; i++){int x; cin >> x; add(i, x); add(x, i);cin >> score[i];}dfs(0, -1);cout << f[0][m] << endl;return 0;
}
经典题目:二叉苹果树(树形dp 边)
传送门:https://www.luogu.com.cn/problem/P2015
状态表示:dp[i][j] 以 i 为根的子树中,保留 j 条边的最多苹果树
这道题有一个隐含的条件,当某条边被保留下来时,从根节点到这条边的路径上的所有边也都必须保留下来
状态转移方程:
dp[i][j] = max( dp[i][j] , dp[i][j-k-1] + dp[t][k] + w[i] ) ( t 为子节点,k是值子树中选择 k 条边)
注意这个题要统计子树中边的条数
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 220;
int f[N][N];
int h[N] , e[N] , ne[N] , idx , w[N];
int Size[N];
int n , m;
void add( int a , int b , int c )
{w[idx] =c ; e[idx] = b; ne[idx] = h[a] ; h[a] = idx++;
}
void dfs( int u , int fa )
{for( int i = h[u] ; i != -1 ; i = ne[i] ){int j = e[i];if( j == fa )continue;dfs( j , u );Size[u] += Size[j] + 1;for( int t = min( Size[u] , m ) ; t ; t-- ){for( int k = min(Size[j] , t - 1 ) ; k >= 0 ; k-- ){f[u][t] = max( f[u][t] , f[u][t-k-1] + f[j][k] + w[i] );}}}
}
signed main()
{memset( h , -1 , sizeof h );cin >> n >> m;for( int i = 0 ; i < n - 1; i ++){int a , b , c; cin>> a >> b >> c;add( a , b ,c );add( b , a , c );}dfs( 1 , -1 );cout << f[1][m] << endl;return 0;
}
相关文章:
树形dp总结
这类题型在 dp 中很常见,于是做一个总结吧!!! 最经典的题:没有上司的舞会 传送门:没有上司的舞会 - 洛谷 状态表示: dp[i][0] 为 以 i 为根的子树中,选择 i 节点的最大欢乐值 d…...

【算法一周目】双指针(2)
目录 有效三角形的个数 解题思路 C代码实现 和为s的两个数字 解题思路 C代码实现 三数之和 解题思路 C代码实现 四数之和 解题思路 C代码实现 有效三角形的个数 题目链接:611. 有效三角形的个数题目描述:给定一个包含非负整数的数组nums&…...
vue内置方法总结
目录 1. 生命周期钩子方法 2. 响应式系统方法 3. DOM 更新方法 4. 事件处理方法 5. 访问子组件和 DOM 元素 6. 数据观察方法 7. 其他方法 1. 生命周期钩子方法 这些方法在 Vue 实例的不同生命周期阶段自动调用。 beforeCreate: 在实例初始化之后,…...
面向对象分析与设计
前言: 感觉书本上和线上课程, 讲的太抽象, 不好理解, 但软件开发不就是为了开发应用程序吗?! 干嘛搞这么抽象,对吧, 下面是个人对于软件开发的看法, 结合我的一些看法, 主打简单易懂, 当然,我一IT界小菜鸟, 对软件开发的认识也很浅显, 这个思维导图也仅仅是现阶段我的看…...
lineageos-19 仓库群遍历,打印第一条git log
lineageos-19 仓库群遍历,打印第一条git log RepoLsRootD/app4/lineage19_oneplus6 LogF/app4/wiki/repo_head_log_ls-lineageos19.1.log rm -v $LogF && \ cd $RepoLsRootD && \ find . -type l -path "*/*.git" -not -path "./.repo/*"…...

详解基于C#开发Windows API的SendMessage方法的鼠标键盘消息发送
在C#中,SendMessage方法是一个强大的工具,它允许我们与Windows API交互,模拟键盘和鼠标事件。本文将详细介绍如何使用SendMessage方法来发送鼠标和键盘消息。 1. SendMessage方法概述 SendMessage是Windows API中的一个函数,它用…...
VMware安装黑苹果后ICLOUD_UNSUPPORTED_DEVICE(不支持的Icloud设备)
修改文件 关闭虚拟机找到虚拟机文件中以.vmx结尾的文件编辑内容(补充缺失) board-id "Mac-551B86E5744E2388" hw.model.reflectHost "FALSE" hw.model "MacBookPro14,3" serialNumber.reflectHost "FALSE"…...

Python | Leetcode Python题解之第542题01矩阵
题目: 题解: class Solution:def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:m, n len(matrix), len(matrix[0])# 初始化动态规划的数组,所有的距离值都设置为一个很大的数dist [[10**9] * n for _ in range(m)]…...

【计算机网络】【传输层】【习题】
计算机网络-传输层-习题 文章目录 10. 图 5-29 给出了 TCP 连接建立的三次握手与连接释放的四次握手过程。根据 TCP 协议的工作原理,请填写图 5-29 中 ①~⑧ 位置的序号值。答案技巧 注:本文基于《计算机网络》(第5版)吴功宜、吴英…...
【LeetCode】【算法】55. 跳跃游戏
LeetCode 99 - 55. 跳跃游戏 题目 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回true;否则,返回 …...

华为:hcia综合实验
一、拓扑图 二、实验要求 1. pc地址请自行规划,vlan已给出 2. 服务器地址自行规划,vlan,网段已给出 3. 交换机互联链路捆绑保证冗余性 4. 内网pc网关集中于核心交换机,交换机vlan 40互联路由器 ,地址网段已给出 5.配置静态路由实…...
MyBatis与MyBatis-Plus(基础)
MyBatis-Plus的优势 在 Spring Data JPA 已经很方便的情况下,有时仍然选择使用 MyBatis-Plus 的核心原因主要有以下三点: 1. 复杂 SQL 控制能力更强 MyBatis-Plus 允许直接编写和优化 SQL,适合复杂查询、精细化 SQL 控制的场景。特别是在性…...
一文总结java语法规则
1. 题记 Java是一门拥有较强语法规则的编程语言,本博文主要总结介绍java语言的java语法规则。 2. java语法规则 2.1 标识符(Identifiers) 定义:标识符是用来给变量、类、方法、接口等命名的字符序列。规则: –标识…...

使用 npm 安装 Yarn
PS E:\WeChat Files\wxid_fipwhzebc1yh22\FileStorage\File\2024-11\spid-admin\spid-admin> yarn install yarn : 无法将“yarn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后…...
vue3中利用路由信息渲染菜单栏
1. 创建路由时将路由信息对象进行抽离 将路由信息对象单独抽离到router/routes.ts文件 关键:利用路由元信息meta,定义3个属性 hidden:控制当前路由是否显示在菜单栏中title:菜单拦名称icon:对应菜单名称前面的图标 …...

Mysql每日一题(行程与用户,困难※)
今天给大家分享一个截止到目前位置,我遇到最难的一道mysql题目,非常建议大家亲手做一遍 完整代码如下,这道题的主要难点是它有两个外键,以前没遇到过,我也没当回事,分享一下错误经验哈 当时我写的where判断…...
adb 命令 查找启动的包名以及导出安装包
查看安卓内包名 adb 查看所有安装的包 adb shell pm list packages查看安装的第三方app的包名 adb shell pm list packages -3查看启动的app的包名 adb shell dumpsys activity top | find "ACTIVITY"adb shell dumpsys activity activities | findstr "Run…...

Flink_DataStreamAPI_输出算子Sink
Flink_DataStreamAPI_输出算子Sink 1连接到外部系统2输出到文件3输出到Kafka4输出到MySQL(JDBC)5自定义Sink输出 Flink作为数据处理框架,最终还是要把计算处理的结果写入外部存储,为外部应用提供支持。 1连接到外部系统 Flink的D…...
标准C++ 字符串
一、标准库中的字符串类型 在C中,字符串是一个非常重要的数据类型,用于表示和处理文本信息。C提供了多种方式来处理字符串,每种方式都有其特点和适用场景。以下是几种常见的字符串类型及其用法: 1. C 风格字符串 (char* 或 char…...

时序预测:多头注意力+宽度学习
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...