树形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催生大模型热潮已将近两年,…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...
VSCode 使用CMake 构建 Qt 5 窗口程序
首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...
