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

算法23:多叉树_派对的最大快乐值

公司的每个员工都符合 Employee 类的描述。整个公司的人员结构可以看作是一棵标准的、 没有环的多叉树。树的头节点是公司唯一的老板。除老板之外的每个员工都有唯一的直接上级。 叶节点是没有任何下属的基层员工(subordinates列表为空),除基层员工外,每个员工都有一个或多个直接下级.

这个公司现在要办party,你可以决定哪些员工来,哪些员工不来规则

1.如果某个员工来了,那么这个员工的所有直接下级都不能来

2.派对的整体快乐值是所有到场员工快乐值的累加

3.你的目标是让派对的整体快乐值尽量大

给定一棵多叉树的头节点boss,请返回派对的最大快乐值。

员工信息的定义如下:

class Employee {public int happy; // 这名员工可以带来的快乐值List<Employee> nexts; // 这名员工有哪些直接下级
}

这道算法题我是花了一整天时间才理清楚的,光靠想象力会把自己给绕晕了。

 分析:假设2个变量missMax 和 joinMax分别记录当前节点参加、缺失时有可能获得的最大快乐值

1)叶子节点是没有子节点的,因此我们可知,如果叶子节点不能参加,那么返回的信息就该为0,如果可以参加,那么他们的返回信息就该为当前叶子结点本身的快乐值。

2)左子树4下方有3个节点,分别为3、3、5.

     a) 如果节点4参加,那么子节点就不能参加,因此,当前节点4的最大快乐值为 4,即 joinMax            = 4;missMax =0;

     b) 如果4节点不参加,那么4节点及子节点就有可能获得的最大快乐值为 3+3+5 = 11,即          missMax = 11; 当然,他们的子节点也依旧可能全部不参加,即 joinMax =0;

     c)  总结:如果4节点参加,获得的最宽快乐值为4,即joinMax  = 4, 如果4不参加,获得的最大快乐值为11,即missMax = 11

3)分析6节点

     a) 如果6节点参加,那么4节点就不能参加,那么有可能获得的最大值最大值就为 6 + 11 = 17, 即 joinMax = 17.  这个11是我们第2步b步骤推导出来的

     b) 如果6节点不参加,那么4节点如果参加,因此,最大值就为4,即missMax=4, 由第2步a步骤推导出来。

     c)如果6节点不参加,4节点也不参加,那么4节点的子节点就可以参加了,此时最大快乐值就可得到 3+3+5=11,即missMax = 11

     d)  6不参加,4参加,最大快乐值为4,即missMax=4; 6不参加,4不参加,得到的最大快乐值为11,即missMax = 11。最终,我们可以根据步骤b和c得到6不参加,可以获得的最大快乐值为11,missMax = 11。

     e) 最终6节点,我们可知:6节点参加,最大快乐值可得到17,即 joinMax = 17;6节点不参加,可得到最大快乐值为11,即missMax = 11

下面分析右子树

1. 节点5

      a) 如果5节点参加,最大快乐值为5,即joinMax = 5;

      b) 如果5不参加,那么最大快乐值为 1+2+3 =6; 即 missMax =6;

2. 节点7

   a) 如果节点7参加,那么5就不可以参加,因此最大快乐值为 7+6=13,即joinMax=13,6是由步骤1的b得到

   b)如果7不参加,5也不参加,那么最大快乐值就是6,即missMax=6

   c)如果7不参加,5参加, 那么最大快乐值就是5,即missMax=5 (小于6)

   d) 总结:7参加,可得最大快乐值joinMax=13, 7不参加,可得最大快乐值为missMax=6

 

此时,返回到根节点进行分析,根节点值也为5

a)根节点参加,节点6和7都不能参加。可得到 5 + 11 + 6 = 22

b) 根节点不参加,那么6和7就可以参加了,可得 17 + 13 = 30.

全部理解上面的分析以后,我们再来看看下面的绘图:

最后,看用套路写代码:

package code03.二叉树_02;import java.util.ArrayList;
import java.util.List;/***  公司的每个员工都符合 Employee 类的描述。整个公司的人员结构可以看作是一棵标准的、 没有环的多叉树。*  树的头节点是公司唯一的老板。除老板之外的每个员工都有唯一的直接上级。*  叶节点是没有任何下属的基层员工(subordinates列表为空),除基层员工外,每个员工都有一个或多个直接下级。**  这个公司现在要办party,你可以决定哪些员工来,哪些员工不来,规则:* 1.如果某个员工来了,那么这个员工的所有直接下级都不能来* 2.派对的整体快乐值是所有到场员工快乐值的累加* 3.你的目标是让派对的整体快乐值尽量大* 给定一棵多叉树的头节点boss,请返回派对的最大快乐值。*/
public class Code12_MaxHappyTree {static class Employee {int happy;List<Employee> nexts;Employee (int happy) {this.happy = happy;nexts = new ArrayList<>();}}public static class Info {//当前层参加的值public int joinMax;//当前层缺失时候的值public int missMax;public Info(int join, int miss) {this.joinMax = join;this.missMax = miss;}}public int maxHappy (Employee boss){if (boss == null) {return 0;}int join = process(boss).joinMax;int miss = process(boss).missMax;System.out.println("领导参加, happy值为 :" + join);System.out.println("领导不参加, happy值为 :" + miss);System.out.println("happy的最大值为值为 :" + Math.max(join, miss));return Math.max(join, miss);}public static Info process(Employee cur) {if (cur == null) {return new Info(0, 0);}//记录当前节点参加时的最大快乐值int curJoin = cur.happy;//记录当前节点不参加时的最大快乐值int curMiss = 0;for (Employee e : cur.nexts) {Info info = process(e);//当前层参加,则代表下一层不能参加。因此要获取下一层不能//参加情况下的最大快乐值curMiss += Math.max(info.missMax, info.joinMax);//当前层参加,则获取下一层不参加情况的最大值curJoin += info.missMax;}return new Info(curJoin, curMiss);}public static void main(String[] args) {Employee e31 = new Employee(3);Employee e32 = new Employee(3);Employee e33 = new Employee(5);Employee e3 = new Employee(4);e3.nexts.add(e31);e3.nexts.add(e32);e3.nexts.add(e33);Employee e41 = new Employee(1);Employee e42 = new Employee(2);Employee e43 = new Employee(3);Employee e4 = new Employee(5);e4.nexts.add(e41);e4.nexts.add(e42);e4.nexts.add(e43);Employee e1 = new Employee(6);e1.nexts.add(e3);Employee e2 = new Employee(7);e2.nexts.add(e4);Employee boss = new Employee(5);boss.nexts.add(e1);boss.nexts.add(e2);Code12_MaxHappyTree test = new Code12_MaxHappyTree();int a = test.maxHappy(boss);System.out.println(a);}
}

相关文章:

算法23:多叉树_派对的最大快乐值

公司的每个员工都符合 Employee 类的描述。整个公司的人员结构可以看作是一棵标准的、 没有环的多叉树。树的头节点是公司唯一的老板。除老板之外的每个员工都有唯一的直接上级。 叶节点是没有任何下属的基层员工(subordinates列表为空)&#xff0c;除基层员工外&#xff0c;每…...

中国ETC行业市场规模及未来发展趋势

中国ETC行业市场规模及未来发展趋势编辑根据市场调研在线网发布的2023-2029年中国ETC行业发展策略分析及战略咨询研究报告分析&#xff1a;随着政府坚持实施绿色出行政策&#xff0c;ETC行业也受到了极大的支持。根据中国智能交通协会统计&#xff0c;2017年中国ETC行业市场规模…...

每日刷题(一)——只出现一次的数字

前言 今天遇到一个位运算的题目&#xff0c;感觉很有意思&#xff0c;记录一下。 Question1 136. 只出现一次的数字 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实…...

洛谷P5737 【深基7.例3】闰年展示 C语言/C++

【深基7.例3】闰年展示 题目描述 输入 x,yx,yx,y&#xff0c;输出 [x,y][x,y][x,y] 区间中闰年个数&#xff0c;并在下一行输出所有闰年年份数字&#xff0c;使用空格隔开。 输入格式 输入两个正整数 x,yx,yx,y&#xff0c;以空格隔开。 输出格式 第一行输出一个正整数&a…...

shell注释

注释对于任何编程语言都是不可忽视的重要组成部分&#xff0c;编写者通过注释来为其他人提供解释或提示&#xff0c;能有效提高代码的可读性。 Bash 同其他编程语言一样提供了两种类型注释的支持。 单行注释多行注释一、Bash 单行注释 在注释段落的开头使用 # &#xff0c;如下…...

【C++入门(上篇)】C++入门学习

前言&#xff1a; 在之前的学习中&#xff0c;我们已经对初阶数据结构进行相应了学习&#xff0c;加上之前C语言的学习功底。今天&#xff0c;我们将会踏上更高一级“台阶”的学习-----即C的学习&#xff01;&#xff01;&#xff01; 文章目录1.C 简介1.1什么是C1.2.C的发展史…...

【密码学】 一篇文章讲透数字签名

【密码学】 一篇文章讲透数字签名 数字签名介绍 数字签名&#xff08;又称公钥数字签名&#xff09;是只有信息的发送者才能产生的别人无法伪造的一段数字串&#xff0c;这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名…...

POI导入导出、EasyExcel批量导入和分页导出

文件导入导出POI、EasyExcel POI&#xff1a;消耗内存非常大&#xff0c;在线上发生过堆内存溢出OOM&#xff1b;在导出大数据量的记录的时候也会造成堆溢出甚至宕机&#xff0c;如果导入导出数据量小的话还是考虑的&#xff0c;下面简单介绍POI怎么使用 POI导入 首先拿到文…...

手把手教你做微信公众号

手把手教你做微信公众号 微信公众号可以通过注册的方式来建立。 1.进入微信公众平台 首先&#xff0c;在浏览器中搜索微信公众号&#xff0c;网页第一个就是&#xff0c;如下图所示&#xff0c;我们点进去。 2.注册微信平台账号 进入官网之后&#xff0c;如下图所示&#…...

python-在macOS上安装python库 xlwings失败的解决方式

问题&#xff1a;python库 xlwings安装失败 今天&#xff0c;看到网上有wlwings库&#xff0c;可以用来处理excel表格&#xff0c;立刻想试一试。结果&#xff0c;安装这个python库失败了。经过排查&#xff0c;问题解决。 安装过程和错误提示&#xff1a; 我用最简单直接的…...

【Linux】进程间通信(匿名管道和命名管道通信、共享内存通信)

文章目录1、进程间通信1.1 进程的通信1.2 如何让进程间通信&#xff1f;1.3 进程间通信的本质2、管道通信2.1 匿名管道2.2 匿名管道通信2.3 命名管道2.4 命名管道的通信3、SystemV中的共享内存通信3.1 共享内存3.2 共享内存的通信3.3 共享内存的缺点以及数据保护3.4 共享内存的…...

漏洞分析: WSO2 API Manager 任意文件上传、远程代码执行漏洞

漏洞描述 某些WSO2产品允许不受限制地上传文件&#xff0c;从而执行远程代码。以WSO2 API Manager 为例&#xff0c;它是一个完全开源的 API 管理平台。它支持API设计&#xff0c;API发布&#xff0c;生命周期管理&#xff0c;应用程序开发&#xff0c;API安全性&#xff0c;速…...

详解Android 13种 Drawable的使用方法

前言关于自定义View&#xff0c;相信大家都已经很熟悉了。今天&#xff0c;我想分享一下关于自定义View中的一部分&#xff0c;就是自定义Drawable。Drawable 是可绘制对象的一个抽象类&#xff0c;相对比View来说&#xff0c;它更加的纯粹&#xff0c;只用来处理绘制的相关工作…...

MakeFile教程

前言 当我们需要编译一个比较大的项目时&#xff0c;编译命令会变得越来越复杂&#xff0c;需要编译的文件越来越多。其 次就是项目中并不是每一次编译都需要把所有文件都重新编译&#xff0c;比如没有被修改过的文件则不需要重 新编译。工程管理器就帮助我们来优化这两个问题…...

Spring使用mongoDB步骤

1. 在Linux系统使用docker安装mongoDB 1.1. 安装 在docker运行的情况下&#xff0c;执行下述命令。 docker run \ -itd \ --name mongoDB \ -v mongoDB_db:/data/db \ -p 27017:27017 \ mongo:4.4 \ --auth执行docker ps后&#xff0c;出现下列行&#xff0c;即表示mongoDB安…...

【蓝牙mesh】access层(接入层)协议介绍

【蓝牙mesh】access层&#xff08;接入层&#xff09;协议介绍 Access层简介 Access层定义了应用层如何使用upper协议层的接口&#xff0c;它不仅定义了应用层的格式&#xff0c;还定义了应用数据在upper层的加密和解密。当收到下层的数据包时&#xff0c;它会检查数据的netke…...

【一天一门编程语言】JavaScript 语言程序设计极简教程

JavaScript 语言程序设计极简教程 用 markdown 格式输出答案。 不少于3000字。细分到2级目录。 一、JavaScript 简介 1.1 什么是 JavaScript JavaScript 是一种由Netscape的LiveScript发展而来的脚本语言&#xff0c;是一种动态类型、弱类型、基于原型的语言&#xff0c;内…...

CMake调试器出炉:调试你的CMake脚本

Visual Studio 开发团队一直和 Kitware 紧密合作&#xff0c;致力于开发一个用于调试 CMake 脚本的调试器。 我们将继续这个工作&#xff0c;以便开发人员社区可以通过添加新功能和对其他 DAP 功能的支持来共同改进它。 我们很高兴地宣布&#xff0c;CMake 调试器的预览版现在…...

题解 # 二维矩阵最大矩形问题#

题目&#xff1a; 小明有一张N*M的方格纸&#xff0c;且部分小方格中涂了颜色&#xff0c;部分小方格还是空白。 给出N (2<Ns30)和M(2sMs30)的值&#xff0c;及每个小方格的状态(&#xff08;被涂了颜色小方格用数字1表示&#xff0c;空白小方格用数字0表示)&#xff1b; 请…...

奔四的路上,依旧倔强的相信未来

本文首发于2022年12月31日 原标题: 奔四的路上,依旧倔强的相信未来!–我的2022年终总结 读大学那几年,一直保持着写日记和做计划的习惯,还记得大学毕业刚开始打工的时候,我的床头的墙上一定会画一张表,写上一个月的计划和一周的计划 计划也会有完不成的时候,但加深了…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用

阻止除自定义标签之外的所有标签 先输入一些标签测试&#xff0c;说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时&#xff08;如通过点击或键盘导航&…...

【Java多线程从青铜到王者】单例设计模式(八)

wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本&#xff0c;sleep也是可以指定时间的&#xff0c;也就是说时间一到就会解除阻塞&#xff0c;继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒)&#xff0c;wait能被notify提前唤醒&#xf…...

STL 2迭代器

文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器&#xff1f; 1.迭代器…...

Spring Boot 与 Kafka 的深度集成实践(二)

3. 生产者实现 3.1 生产者配置 在 Spring Boot 项目中&#xff0c;配置 Kafka 生产者主要是配置生产者工厂&#xff08;ProducerFactory&#xff09;和 KafkaTemplate 。生产者工厂负责创建 Kafka 生产者实例&#xff0c;而 KafkaTemplate 则是用于发送消息的核心组件&#x…...

Spring AI中使用ChatMemory实现会话记忆功能

文章目录 1、需求2、ChatMemory中消息的存储位置3、实现步骤1、引入依赖2、配置Spring AI3、配置chatmemory4、java层传递conversaionId 4、验证5、完整代码6、参考文档 1、需求 我们知道大型语言模型 &#xff08;LLM&#xff09; 是无状态的&#xff0c;这就意味着他们不会保…...