当前位置: 首页 > news >正文

二叉苹果树

image-20241102203449843
AcWing 1074. 二叉苹果树【有依赖背包DP】 - AcWing

问题描述

在一棵有权无向树中,从某个节点(这里假设为节点 1)出发,遍历树的子节点,每经过一条边会获得对应的权重值。在访问节点数的限制下(即体积限制),我们希望获得最大的路径权重和。

代码解析

1. 全局变量和常量
const int N = 110, M = N << 1;
int n, m;           // n 表示节点数, m 表示最大访问节点数(体积限制)
int h[N], e[M], w[M], ne[M], idx; // 邻接表
int f[N][N];        // 动态规划数组 f[u][j] 表示以 u 为根的子树中,最多选择 j 条边能得到的最大权重和
  • N 是节点数上限,M 是边数的上限。
  • h[N]:邻接表的头节点数组,h[u] 表示从 u 出发的第一条边在 e 中的索引。
  • e[M]:邻接表存储的边的目标节点数组。
  • w[M]:边的权重数组,表示 e[i] 对应边的权重。
  • ne[M]:存储下一条边的索引。
  • idx:记录当前插入边的位置。
  • f[u][j]:动态规划数组,表示以 u 为根的子树中,选择至多 j 条边所能获得的最大权重和。
2. 添加边函数 add
void add(int a, int b, int c) {e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
  • 该函数通过邻接表方式添加边。ab 的边权重为 c,同时更新 h[a]ne 数组。
3. 深度优先搜索 dfs
void dfs(int u, int father) {for (int i = h[u]; ~i; i = ne[i]) {int ver = e[i];if (ver == father) continue;dfs(ver, u);for (int j = m; j >= 0; j--)for (int k = 0; k <= j - 1; k++)f[u][j] = max(f[u][j], f[u][j - k - 1] + f[ver][k] + w[i]);}
}
  • dfs 是核心的递归函数。以节点 u 为根节点,递归处理子树中的路径选择问题。
  • 遍历从 u 出发的每一条边,跳过回到父节点的边 father
  • 调用 dfs(ver, u) 递归处理子节点 ver 的子树,计算在 ver 处的最优路径权重。
  • 动态规划转移
    • 外层循环 j:表示从 u 出发选择至多 j 条边。
    • 内层循环 k:枚举当前子节点选择的边数。
    • 转移方程 f[u][j] = max(f[u][j], f[u][j - k - 1] + f[ver][k] + w[i]);
      • f[u][j]:更新 u 节点的最优解。
      • f[u][j - k - 1]u 剩余的边数(预留一个选择的子节点跟父节点交互时的链接)。
      • f[ver][k]:子节点 ver 的最优解。
      • w[i]uver 的边权。
4. 主函数 main
int main() {memset(h, -1, sizeof h);scanf("%d%d", &n, &m);for (int i = 1; i < n; i++) {int a, b, c;scanf("%d%d%d", &a, &b, &c);add(a, b, c), add(b, a, c);}dfs(1, -1);printf("%d\n", f[1][m]);return 0;
}
  • 初始化邻接表头数组 h,设为 -1 表示空。
  • 输入节点数 n 和最大体积 m
  • 读取并建立双向边,add(a, b, c)add(b, a, c) 将每条边双向存储。
  • 从节点 1 开始进行 DFS,设 -1 为父节点标记,避免重复访问。
  • 输出 f[1][m],即以 1 为根、最多选 m 条边所能获得的最大权重和。

相关文章:

二叉苹果树

AcWing 1074. 二叉苹果树【有依赖背包DP】 - AcWing 问题描述 在一棵有权无向树中&#xff0c;从某个节点&#xff08;这里假设为节点 1&#xff09;出发&#xff0c;遍历树的子节点&#xff0c;每经过一条边会获得对应的权重值。在访问节点数的限制下&#xff08;即体积限制…...

【大数据学习 | kafka】producer的参数与结构

1. producer的结构 producer&#xff1a;生产者 它由三个部分组成 interceptor&#xff1a;拦截器&#xff0c;能拦截到数据&#xff0c;处理完毕以后发送给下游&#xff0c;它和过滤器不同并不是丢弃数据&#xff0c;而是将数据处理完毕再次发送出去&#xff0c;这个默认是不…...

2. 从服务器的主接口入手

Webserver 的主函数 main.cpp&#xff0c;完成了哪些功能&#xff1f; #include "config.h"int main(int argc, char *argv[]) {string user "";string passwd "";string databasename "";Config config;config.parse_arg(argc, a…...

nginx上传文件超过限制大小、响应超时、反向代理请求超时等问题解决

1、文件大小超过限制 相关配置&#xff1a; client_max_body_size&#xff1a; Syntax:client_max_body_size size;Default:client_max_body_size 1m;Context:http, server, location 2、连接超时: proxy_read_timeout&#xff1a; Syntax:proxy_read_timeout time;Default…...

第16课 核心函数(方法)

掌握常用的内置函数及其用法。 数学类函数&#xff1a;abs、divmod、max、min、pow、round、sum。 类型转换函数&#xff1a;bool、int、float、str、ord、chr、bin、hex、tuple、list、dict、set、enumerate、range、object。 序列操作函数&#xff1a;all、any、filter、m…...

【工具变量】中国制造2025试点城市数据集(2000-2023年)

数据简介&#xff1a;《中国制造2025》是中国ZF于2015年5月8日印发的一项战略规划&#xff0c;旨在加快制造业的转型升级&#xff0c;提升制造业的质量和效益&#xff0c;实现从制造大国向制造强国的转变。该规划是中国实施制造强国战略的第一个十年行动纲领&#xff0c;明确提…...

vscode makfile编译

MinGW-w64下载安装 为了在 Windows 上安装 GCC&#xff0c;您需要安装 MinGW-w64。 MinGW-w64 是一个开源项目&#xff0c;它为 Windows 系统提供了一个完整的 GCC 工具链&#xff0c;支持编译生成 32 位和 64 位的 Windows 应用程序。 访问 MinGW-w64 的主页 mingw-w64.org…...

(四)PostgreSQL数据库操作示例

删除有外键约束的表 最近做数据库练习遇到一个问题&#xff0c;数据库里面有一个表&#xff0c;存在外键约束&#xff0c;我想要删除&#xff0c;所以必须先删除这些外键约束。 查询外键约束 查找外键约束&#xff1a;当你需要知道某个表的外键约束及其引用关系时&#xff0…...

Docker-微服务项目部署

环境准备 1.微服务项目 参考&#xff1a;通过网盘分享的文件&#xff1a;wolf2w_cloud.zip 链接: https://pan.baidu.com/s/1Lr4k6LPIJ59gVNA_DgKM_Q?pwdkjxt 提取码: kjxt 前端项目&#xff1a;trip-mgrsite-ui&#xff0c;trip-website-ui&#xff0c;trip-wenda-ui 服务项…...

测试Bug提交报告模板

撰写测试Bug提交说明时&#xff0c;清晰、详细和准确是至关重要的。这有助于开发团队快速理解问题、重现Bug并修复它。以下是一个测试Bug提交说明的模板&#xff0c;可以根据实际情况进行调整&#xff1a; 测试Bug提交说明 1. Bug基本信息 Bug编号&#xff1a;[系统自动生成…...

MybatisPlus - 核心功能

文章目录 1.MybatisPlus实现基本的CRUD快速开始常见注解常见配置 2.使用条件构建造器构建查询和更新语句条件构造器自定义SQLService接口 官网 MybatisPlus无侵入和方便快捷. MybatisPlus不仅仅可以简化单表操作&#xff0c;而且还对Mybatis的功能有很多的增强。可以让我们的开…...

小柴冲刺软考中级嵌入式系统设计师系列二、嵌入式系统硬件基础知识(6)嵌入式系统总线及通信接口

目录 越努力&#xff0c;越幸运&#xff01; flechazo 小柴冲刺软考中级嵌入式系统设计师系列总目录 一、PCI、PCI-E 等接口基本原理与结构 1、PCI (1)高速性。 (2)即插即用性。 (3)可靠性。 (4)复杂性。 (5)自动配置。 (6)共享中断。 (7)扩展性好。 (8)多路复用。…...

利用字典对归一化后的数据0误差还原

假设我对精度要求很高&#xff0c;高到无法容忍有任何误差&#xff0c;那么我先将x按照大小排序&#xff0c;然后归一化&#xff0c;用字典将归一化前后的x存储下来&#xff0c;在深度学习时使用归一化后的x进行处理&#xff0c;但是最后画图等处理时&#xff0c;我用字典取出归…...

HarmonyOS:UIAbility组件概述

一、概述 UIAbility组件是一种包含UI的应用组件&#xff0c;主要用于和用户交互。 UIAbility的设计理念&#xff1a; 原生支持应用组件级的跨端迁移和多端协同。支持多设备和多窗口形态。 UIAbility划分原则与建议&#xff1a; UIAbility组件是系统调度的基本单元&#xff0c…...

12寸半导体厂说的华夫区是什么意思

1\什么是华夫板 在半导体行业中,“华夫区”通常指的是“华夫板”(Waffle Slab),这是一种特殊设计的楼板,其表面具有许多均匀分布的孔洞,这些孔洞形成了回风通道,用于电子芯片厂房等对空气洁净度有极高要求的环境。华夫板的设计和施工对于保证洁净室的功能发挥至关重要。…...

数据结构之链式结构二叉树的实现(进阶版)

本篇文章主要讲解链式二叉树的层序遍历以及判断是否为一棵完全二叉树 二者将会用到之前学过的队列知识&#xff0c;是将队列和二叉树的整合 一、如何将之前已经写好的文件加入当前的编译界面 如图所示&#xff0c;打开我们需要加入文件所在的文件夹&#xff0c;找到我们要加…...

【高等数学】3-2多元函数积分学

1. 二重积分 可以想象你有一块不规则的平面薄板,它在一个平面区域上。二重积分就是用来求这个薄板的质量(假设薄板的面密度函数是)。 把区域划分成许多非常小的小方块(类似于把一块地划分成很多小格子),在每个小方块上,密度近似看成是一个常数,然后把每个小方块的质量加…...

【传知代码】智慧医疗:纹理特征VS卷积特征

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;传知代码 欢迎大家点赞收藏评论&#x1f60a; 目录 论文概述纹理特征和深度卷积特征算法流程数据预处理方法纹理特征提取深度卷积特征提取分类网络搭建代码复现BLS_Model.py文件——分类器搭建py…...

Python-创建并调用自定义文件中的模块/函数

背景&#xff1a;在Python编程中&#xff0c;我们常常需要创建自己的专属文件&#xff0c;以便帮助我们更高效&#xff0c;快捷地完成任务。那么在Python中我们怎么创建并调用自己文件中的模块/函数呢? 在Python中调用自定义文件&#xff0c;通常是指调用自己编写的Python模块…...

Kali Linux

起源与背景 Kali Linux是一个基于Debian的开源Linux发行版&#xff0c;专门为信息安全工作者和渗透测试员设计。它是由Offensive Security Ltd.开发和维护的&#xff0c;作为BackTrack的继承者而诞生。BackTrack是一个流行的安全测试发行版&#xff0c;但为了提供更好的支持和…...

DiffusionDet: Diffusion Model for Object Detection—用于对象检测的扩散模型论文解析

DiffusionDet: Diffusion Model for Object Detection—用于对象检测的扩散模型论文解析 这是一篇发表在CVPR 2023的一篇论文&#xff0c;因为自己本身的研究方向是目标跟踪&#xff0c;之前看了一点使用扩散模型进行多跟踪的论文&#xff0c;里面提到了DiffusionDet因此学习一…...

深度学习基础知识-编解码结构理论超详细讲解

编解码结构&#xff08;Encoder-Decoder&#xff09;是一种应用广泛且高效的神经网络架构&#xff0c;最早用于序列到序列&#xff08;Seq2Seq&#xff09;任务&#xff0c;如机器翻译、图像生成、文本生成等。随着深度学习的发展&#xff0c;编解码结构不断演变出多种模型变体…...

探讨Java深搜算法的学习笔记

大家好&#xff0c;我是 V 哥。深度优先搜索&#xff08;DFS&#xff09;是一种图遍历算法&#xff0c;它优先深入到某条路径的尽头&#xff0c;再回溯到前一个节点继续探索其他路径&#xff0c;直到找到目标或遍历完整个图。DFS的应用场景广泛&#xff0c;可以用于路径搜索、连…...

408——操作系统(持续更新)

文章目录 一、操作系统的概念及特征1.1 计算机系统的概念1.2 操作系统的基本特征 二、操作系统的功能和接口2.1 操作系统作为计算机资源的管理者2.2 操作系统作为用户和计算机硬件系统之间的接口2.3 操作系统实现对计算机资源的扩充 三、操作系统的发展和分类四、操作系统的运行…...

架构师之路-学渣到学霸历程-37

Nginx的热部署实验 本次分享的就是nginx的升级以及降级&#xff0c;实验中其实很多操作都需要理解&#xff0c;实际操作不难&#xff0c;但是需要全面理解这个动作&#xff0c;敲这个命令是用来干什么的&#xff1f;借着这个笔记可以试一下&#xff1b;go~&#xff01; 1、ng…...

CSRF与SSRF

csrf(跨站请求伪造)的原理: csrf全称是跨站请求伪造(cross-site request forgery)&#xff0c;也被称为one-click attack 或者 session riding scrf攻击利用网站对于用户网页浏览器的信任&#xff0c;劫持用户当前已登录的web应用程序&#xff0c;去执行分用户本意的操作。 利…...

RabbitMQ 存储机制

一、消息存储机制 不管是持久化的消息还是非持久化的消息都可以被写入到磁盘。持久化的消息在到达队列时就被写入到磁盘&#xff0c;非持久化的消息一般只保存在内存中&#xff0c;在内存吃紧的时候会被换入到磁盘中&#xff0c;以节省内存空间。这两种类型的消息的落盘处理都…...

【Java SE】类型转换

类型转换是将一个值从一种类型转换为另一种类型的过程。该过程如果从低精度数据类型转为高精度数据类型&#xff0c;则不会发生溢出并且总能成功&#xff0c;如果从高精度数据类型转为低精度数据类型&#xff0c;则会有信息丢失且可能失败。类型转换又可分为隐式转换和显式转换…...

JAVA:常见 JSON 库的技术详解

1、简述 在现代应用开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已成为数据交换的标准格式。Java 提供了多种方式将对象转换为 JSON 或从 JSON 转换为对象&#xff0c;常见的库包括 Jackson、Gson 和 org.json。本文将介绍几种常用的 JSON 处理…...

Redis缓存击穿、雪崩、穿透解决方案

Redis 缓存击穿、雪崩、穿透解决方案 1、首先看看逻辑方面是否还有优化空间&#xff0c;正常流程查询redis中获取不到数据&#xff0c;则去数据库获取&#xff0c;但数据库查询并返回时&#xff0c;调用异步方法&#xff0c;将该数据存储进redis中&#xff0c;并设置一个较短的…...