树形DP讲解
文章目录
- 树形DP讲解
- 一、引言
- 二、树形DP基础
- 1、树的定义
- 2、树形DP的基本思想
- 3、代码示例:子树大小
- 三、经典例题解析
- 1、树的平衡点
- 1.1、代码示例
- 2、没有上司的舞会(树的最大独立集)
- 2.1、代码示例
- 四、总结
树形DP讲解
一、引言
树形动态规划(Tree DP)是动态规划中的一种特殊形式,它专门用于解决与树结构相关的问题。树形DP的核心思想是利用树的分形结构,递归地定义和解决问题。在这篇文章中,我们将深入探讨树形DP的基本概念、经典例题以及实际应用。
二、树形DP基础
1、树的定义
在图论中,树被定义为一个连通且无圈的图。树的分形结构意味着树的每个子树也是一棵完整的树,这使得树形DP天然适合递归求解。
2、树形DP的基本思想
树形DP通常遵循“先子树后合并”的原则,这与树的后序遍历相似。我们先递归访问所有子树,然后在根节点上合并结果。
3、代码示例:子树大小
void dfs(int u) {if (u 是叶子) {f[u] = 1;return;}for (int v : e[u]) {dfs(v);f[u] += f[v];}f[u] += 1; // 本身
}
这段代码通过深度优先搜索(DFS)计算以每个节点为根的子树大小。
三、经典例题解析
1、树的平衡点
平衡点是指删除树中的某个节点后,使得剩下的连通块中最大的连通块大小最小。我们可以通过计算每个节点的子树大小来找到平衡点。
1.1、代码示例
import java.util.ArrayList;
import java.util.List;public class Main {static final int N = 100010; // 假设N是图的最大节点数static List<Integer>[] e = new ArrayList[N];static int ans, idx, f[] = new int[N];public static void main(String[] args) {// 初始化邻接表for (int i = 0; i < N; i++) {e[i] = new ArrayList<>();}// 示例调用int root = 1; // 假设1是树的根节点int fa = 0; // 根节点没有父节点dfs(root, fa);System.out.println("最大值: " + ans + ", 节点: " + idx);}static void dfs(int u, int fa) {f[u] = 1;int mx = 0;for (int v : e[u]) {if (v == fa) continue;dfs(v, u);f[u] += f[v];mx = Math.max(mx, f[v]);}mx = Math.max(mx, n - f[u]);if (ans < mx) {ans = mx;idx = u;}}// 假设n是节点总数static int n = 10; // 这里需要根据实际情况设置
}
2、没有上司的舞会(树的最大独立集)
在这个问题中,我们需要找到树的最大权值独立集,即没有直接上司和下属关系的节点集合。
2.1、代码示例
import java.util.ArrayList;
import java.util.Scanner;public class Main {static final int N = 10000 + 10;static ArrayList<Integer>[] tr = new ArrayList[N];static int[][] f = new int[N][2];static int[] v = new int[N];static int[] Happy = new int[N];static int n;public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 初始化邻接表for (int i = 0; i < N; i++) {tr[i] = new ArrayList<>();}n = scanner.nextInt();for (int i = 1; i <= n; ++i) {Happy[i] = scanner.nextInt();}for (int i = 1; i < n; ++i) {int x = scanner.nextInt();int y = scanner.nextInt();tr[y].add(x);}int root = 0;for (int i = 1; i <= n; ++i) {if (v[i] == 0) {root = i;break;}}dfs(root);System.out.println(Math.max(f[root][0], f[root][1]));}static void dfs(int u) {f[u][0] = 0;f[u][1] = Happy[u];for (int v : tr[u]) {dfs(v);f[u][0] += Math.max(f[v][0], f[v][1]);f[u][1] += f[v][0];}}
}
四、总结
树形DP是一种强大的算法工具,它通过利用树的结构特性来解决复杂的优化问题。通过本文的介绍和代码示例,我们可以看到树形DP在解决树相关问题时的效率和优雅。掌握树形DP不仅能够提升算法设计能力,还能在实际问题中找到创新的解决方案。
版权声明:本博客内容为原创,转载请保留原文链接及作者信息。
参考文章:
- 【动态规划】树形DP完全详解! - RioTian - 博客园
相关文章:
树形DP讲解
文章目录 树形DP讲解一、引言二、树形DP基础1、树的定义2、树形DP的基本思想3、代码示例:子树大小 三、经典例题解析1、树的平衡点1.1、代码示例 2、没有上司的舞会(树的最大独立集)2.1、代码示例 四、总结 树形DP讲解 一、引言 树形动态规…...
容器:如何调试容器
调试容器,主要是指的调试Dockerfile,调试Dockerfile中的各个命令的执行,大小等 1、docker history查看构建过程和所有的中间层 2、docker run rm -it -u root XXX sh,通过临时容器的方式启动,可以调试中间层文件 3、do…...
用图说明 CPU、MCU、MPU、SoC 的区别
CPU CPU 负责执行构成计算机程序的指令,执行这些指令所指定的算术、逻辑、控制和输入/输出(I/O)操作。 MCU (microcontroller unit) 不同的 MCU 架构如下,注意这里的 MPU 表示 memory protection unit MPU (microprocessor un…...
牛客周赛 Round 65
文章目录 超市思路:Solved: 雨幕思路:Solved: 闺蜜思路:Solved: 医生思路:Solved: 降温(easy)思路:Solved: F-降温(hard&a…...
超级经典的79个软件测试面试题(内含答案)
1、软件的生命周期(prdctrm) 计划阶段(planning)-〉需求分析(requirement)-〉设计阶段(design)-〉编码(coding)->测试(testing)->运行与维护(running maintrnacne) 测试用例 用例编号 测试项目 测试标题 重要级别 预置条件 输入数据 执行步骤 预期结果 2、问…...
【Mac】安装 F5-TTS
1、下载项目 项目地址:【GitHub】 SWivid F5-TTS 2、创建并激活 Python 虚拟环境 # 创建 Python 虚拟环境 userMac F5-TTS-main % python3 -m venv f5-tts# 激活进入 Python 虚拟环境 userMac F5-TTS-main % source f5-tts/bin/activate (f5-tts) userrMac F5-TT…...
Leaflet查询矢量瓦片偏移的问题
1、问题现象 使用Leaflet绘制工具查询出来的结果有偏移 2、问题排查 1)Leaflet中latLngToContainerPoint和latLngToLayerPoint的区别 2)使用Leaflet查询需要使用像素坐标 3)经排查发现,container获取的坐标是地图容器坐标&…...
存储引擎技术进化
B-tree 目前支撑着数据库产业的半壁江山。 50 年来不变而且人们还没有改变它的意向 鉴定一个算法的优劣,有一个学派叫 IO复杂度分析 ,简单推演真假便知。 下面就用此法分析下 B-tree(traditional b-tree) 的 IO 复杂度,对读、写 IO 一目了…...
CentOS 9 Stream 上安装 Maven
CentOS 9 Stream 上安装 Maven 在 CentOS 9 Stream 上安装 Maven,可以按照以下步骤进行: 更新系统软件包: sudo dnf update安装 Maven: CentOS 9 Stream 默认的包管理器中已经包含 Maven,你可以直接安装: s…...
强势改进!TCN-Transformer时间序列预测
强势改进!TCN-Transformer时间序列预测 目录 强势改进!TCN-Transformer时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现TCN-Transformer时间序列预测; 2.运行环境为Matlab2023b; 3.单个变量时间序…...
MyBatis的不同参数传递封装
MyBatis参数传递 传参方式 1. 使用 #{} 占位符 这是 MyBatis 中最常用的参数传递方式。它将参数直接替换到 SQL 语句中的占位符位置。 单个参数: <select id"selectUserById" resultType"User">SELECT * FROM users WHERE id #{id}…...
kotlin 协程方法总结
Kotlin 协程是一套强大的异步编程工具,以下是对 Kotlin 协程常用方法的总结: 1. 协程构建器 launch: 启动一个新的协程,不阻塞当前线程,返回一个 Job 对象。 GlobalScope.launch {// 协程体}async: 启动一个新的协程并返回一个…...
脉冲当量计算方法
脉冲的概念: 脉冲当量是指控制器输出一个定位控制脉冲时,所产生的定位控制移动的位移。在直线运动中,它表示移动的距离;在圆周运动中,它表示转动的角度。简而言之,脉冲当量就是电机接收一个脉冲信号后能够移…...
TongWeb7.0.E.6_P11嵌入式版本使用指引(by lqw)
文章目录 声明相关概念手册的使用示范工程安装工程介质 安装前准备示范工程参考(spring-boot-helloWorld-2.x)示范参考 声明 1.本文参考001_TongWeb_V7.0嵌入式版_JavaEE标准容器用户指南_70E6_P11A01.pdf,实际以最新更新的手册为准。 2.本文…...
Node.js:Express 服务 路由
Node.js:Express 服务 & 路由 创建服务处理请求req对象 静态资源托管托管多个资源挂载路径前缀 路由模块化 Express是Node.js上的一个第三方框架,可以快速开发一个web框架。本质是一个包,可以通过npm直接下载。 创建服务 Express创建一…...
C++之多态(上)
C之多态 多态的概念 多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态),这⾥我们重点讲运⾏时多态,编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)主…...
PySpark单机模式安装教程
目录 1. 环境准备 1.1 安装要求 1.2 检查Python和Java环境 2. 下载并解压Spark 2.1 下载Spark 2.2 解压安装包 3. 配置环境变量 4. 配置Spark 5. 启动Spark Shell 6. 运行测试 7. 关闭Spark Shell 8. 常见问题 8.1 兼容性问题 8.2 环境变量配置 总结 1. 环境准备…...
DEVOPS: 认证与调度
概述 不知道大家有没有意识到一个现实,就是大部分时候,我们已经不像以前一样通过命令行,或者可视窗口来使用一个系统了现在我们上微博、或者网购,操作的其实不是眼前这台设备,而是一个又一个集群 通常,这样…...
ICPC区域赛成都站【赛后回顾+总结】
传送门 前言赛后总结赛后回顾赛后感悟 前言 首先,这是本人本赛季第一场XCPC区域赛,也是本人算竞生涯中第一场XCPC区域赛(之前只打过邀请赛和省赛)。 赛后总结 然后赛后总结一下:我队天崩开局,我队出师不利…...
保险大模型革新:全面自动化倒计时
摘 要 大模型于保险业不仅是一个技术升级的过程,更是一种商业模式的变革 未来将会是一切都连接着AI的世界——科技杂志《连线》创始主编凯文凯利(KevinKelly)曾在《5000天后的世界》中预测。 ChatGPT催生大模型热潮已将近两年,…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
