leetCode 2925. 在树上执行操作以后得到的最大分数 + 正则难反 + 树形 DP

2925. 在树上执行操作以后得到的最大分数 - 力扣(LeetCode)

有一棵 n 个节点的无向树,节点编号为 0  n - 1 ,根节点编号为 0 。给你一个长度为 n - 1 的二维整数数组 edges 表示这棵树,其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 有一条边。

同时给你一个长度为 n 下标从 0 开始的整数数组 values ,其中 values[i] 表示第 i 个节点的值。一开始你的分数为 0 ,每次操作中,你将执行:

  • 选择节点 i 。
  • 将 values[i] 加入你的分数。
  • 将 values[i] 变为 0 。

如果从根节点出发,到任意叶子节点经过的路径上的节点值之和都不等于 0 ,那么我们称这棵树是 健康的 。你可以对这棵树执行任意次操作,但要求执行完所有操作以后树是 健康的 ,请你返回你可以获得的 最大分数 。

输入:edges = [[0,1],[0,2],[0,3],[2,4],[4,5]], values = [5,2,5,2,1,1]
输出:11
解释:我们可以选择节点 1 ,2 ,3 ,4 和 5 。根节点的值是非 0 的。所以从根出发到任意叶子节点路径上节点值之和都不为 0 。所以树是健康的。你的得分之和为 values[1] + values[2] + values[3] + values[4] + values[5] = 11 。11 是你对树执行任意次操作以后可以获得的最大得分之和。

输入:edges = [[0,1],[0,2],[1,3],[1,4],[2,5],[2,6]], values = [20,10,9,7,4,3,5]
输出:40
解释:我们选择节点 0 ,2 ,3 和 4 。
- 从 0 到 4 的节点值之和为 10 。
- 从 0 到 3 的节点值之和为 10 。
- 从 0 到 5 的节点值之和为 3 。
- 从 0 到 6 的节点值之和为 5 。
所以树是健康的。你的得分之和为 values[0] + values[2] + values[3] + values[4] = 40 。
40 是你对树执行任意次操作以后可以获得的最大得分之和。

(方法一)参考灵神这篇文章:2925. 在树上执行操作以后得到的最大分数 - 力扣(LeetCode) 

思路分析:题目中“如果从根节点出发,到任意叶子节点经过的路径上的节点值之和都不等于 0”。所在在执行操作时,每条从根节点到叶子节点的路径上,都存在一个节点不去操作(多条路径可能共用一个不操作的节点)

  • 为了使得分数最大,不操作的节点之和应尽可能地小

定义一棵以 u 为根节点的健康子树:

  • ① 要么不操作根节点 u ,此时这棵树是健康的,剩余的所有子节点都可以操作
  • ② 要么操作根节点 u ,但是 u 的所有子树都需要保证自己是健康的

要得到最小和,取其两者情况的最小值

建图:

int n = values.size();
vector<vector<int>> g(n);
g[0].push_back(-1); // 避免误把根节点当作叶子
for(auto &e:edges) {int x = e[0], y = e[1];g[x].push_back(y);g[y].push_back(x);
}

class Solution {
public:long long maximumScoreAfterOperations(vector<vector<int>>& edges, vector<int>& values) {int n = values.size();vector<vector<int>> g(n);g[0].push_back(-1); // 避免误把根节点当作叶子for(auto &e:edges) {int x = e[0], y = e[1];g[x].push_back(y);g[y].push_back(x);}// dfs(x,fa) 计算以 x 为根的子树是健康时,失去的最小分数function<long long(int,int)> dfs = [&](int x,int fa)-> long long {if(g[x].size() == 1) { // x 是叶子return values[x];}long long loss = 0; // 第二种情况for(int y:g[x]) {if(y!=fa) {loss+=dfs(y,x);// 计算以 y 为根的子树是健康时,失去的最小分数}} return min((long long) values[x],loss); // 两种情况取最小值};long long sum = accumulate(values.begin(),values.end(),0LL);return sum - dfs(0,-1);}
};

复杂度分析

  • 时间复杂度:O(n),其中 n 为 values 的长度
  • 空间复杂度:O(n)

(方法二)参考sad_path这篇文章2925. 在树上执行操作以后得到的最大分数 - 力扣(LeetCode)

class Solution {
public:class Node{public:Node(long x,int i) : val(x),index(i){}public:long val;int index;public:list<Node*> childArr;};long long maximumScoreAfterOperations(vector<vector<int>>& edges, vector<int>& values) {int n = values.size();// 建树,实际上是建图vector<Node *> nodes;for(int i=0;i<n;i++) {nodes.push_back(new Node(values[i],i));}for(auto &e:edges) {int x = e[0], y = e[1];nodes[x]->childArr.push_back(nodes[y]);nodes[y]->childArr.push_back(nodes[x]);}vector<bool> visited(n,false);visited[0] = true;long long sum = accumulate(values.begin(),values.end(),0LL);long long Min = dfs(nodes[0], visited);return sum - Min;}long long dfs(Node* root,vector<bool> visited) {int count = 0;long Min = 0;for (Node* child : root->childArr) {if (visited[child->index]) {count++;continue;}visited[child->index] = true;Min += dfs(child, visited);visited[child->index] = false;}// 此时该节点为叶节点,直接返回它的 valif (count == root->childArr.size()) {return root->val;}return min(root->val, Min);}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/202479.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈能源智能管理系统在大学高校中的应用

安科瑞 华楠 摘要&#xff1a;结合深圳南方科技大学能效系统工程设计实例&#xff0c;针对校园中电耗、热量消耗、冷量消耗及水资源消耗数据的采集、传输、分析管理系统&#xff0c;分析了系统中的水、电、气在高校中的能耗分布&#xff0c;并阐述了节能应用方案&#xff0c;可…

「纯电」厮杀,广州车展的年末大戏

作者 |张祥威 编辑 |德新 年末的广州车展&#xff0c;揭开纯电动车激烈厮杀的一角。 1100多款车型亮相在这届车展&#xff0c;其中新能源车有460多辆&#xff0c;占接近一半比例。这其中&#xff0c;人们的焦点又放在十多款纯电车型上。 造车新势力中&#xff0c;理想的首款…

基于Python+TensorFlow+Django的交通标志识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 随着交通网络的不断扩展和智能交通系统的发展&#xff0c;交通标志的自动识别变得愈发重要。本项目旨在利用Python编…

micro_ros

原文链接Supported Hardware | micro-ROS Supported Hardware The main targets of micro-ROS are mid-range 32-bits microcontroller families. Usually, the minimum requirements for running micro-ROS in an embedded platform are memory constraints. Since memory u…

阿里云ECS服务器如何搭建并连接FTP,完整步骤

怎么用终端连接服务器就不多说了&#xff0c;直接开始搭建FTP。 我是用root账号执行的命令&#xff0c;如果不使用root账号&#xff0c;注意在命令前面加sudo。 一、安装FTP 我这里安装的是vsftpd。 1、检查是否已安装vsftpd&#xff1a; vsftpd -v如果出现了版本信息&…

Atlassian Confluence 路径遍历和命令执行漏洞 (CVE-2019-3396)

漏洞描述 Confluence 是由澳大利亚软件公司 Atlassian 开发的基于 Web 的企业 wiki。 Atlassian Confluence 6.14.2 版本之前存在一个未经授权的目录遍历漏洞&#xff0c;攻击者可以使用 Velocity 模板注入读取任意文件或执行任意命令。 漏洞环境及漏洞利用 启动docker环境…

【git】pip install git+https://github.com/xxx/xxx替换成本地下载编译安装解决网络超时问题

目录 &#x1f311;&#x1f311; 背景 &#x1f312; &#x1f312;作用 &#x1f314;&#x1f314; 问题 &#x1f314;&#x1f314;解决方案 &#x1f319;方法一 &#x1f319;方法二 &#x1f31d;&#x1f31d;我的解决方案 整理不易&#xff0c;欢迎一键三连…

【硬核HeyGen平替】在window平台上使用MyHeyGen

最近在研究HeyGen的平替开源项目&#xff0c;然后发现了MyHeyGen这个项目&#xff0c;但是文档上面并没有说明如果在window平台上使用&#xff0c;考虑到非window平台安装显卡驱动什么的比较繁琐&#xff0c;所以尝试硬着头皮干... 前提 开源项目中所需的环境准备要先准备好 1…

轻松记录收支明细,一键打印,财务无忧!

作为现代人&#xff0c;管理好个人财务是非常重要的。但是&#xff0c;如何记录收支明细并打印出来呢&#xff1f;今天&#xff0c;我们向您推荐一款财务软件&#xff0c;帮助您轻松解决这个问题。 首先第一步&#xff0c;我们要打开【晨曦记账本】&#xff0c;并登录账号。 第…

神经网络训练技巧

1. 逐渐增加训练数据规模&#xff0c;比如先在小数据集上训练&#xff0c;之后再增大数据集继续训练。

安卓隐私指示器学习笔记

最近了解到Google 在Android12上新增了权限指示器&#xff0c;可以在信号栏的右侧显示当前访问录音机和Camera的应用&#xff0c;点击后可以跳转到相应应用的权限界面&#xff0c;消费者可以控制权限的开启和关闭。国内手机厂商最近几年都在增加隐私看板供能&#xff0c;消费者…

电脑出现api-ms-win-crt-runtime-l1-1-0.dll丢失的情况有什么解决办法,dll文件丢失的方法

在使用电脑过程中&#xff0c;有时可能会遇到缺失api-ms-win-crt-runtime-l1-1-0.dll文件的问题&#xff0c;这可能导致某些应用程序无法正常运行。本文将介绍三种解决这个问题的方法&#xff0c;并比较它们的优缺点。 一.解决api-ms-win-crt-runtime-l1-1-0.dll丢失的问题 方…

Excel文件比较不再繁琐,xlCompare助您快速找出差异

概要 在现代职场中&#xff0c;Excel 已成为工作中不可或缺的利器。 在日常操作中&#xff0c;我们会遇到需要对两个或多个 Excel 文件进行比较的情况&#xff0c;此时&#xff0c;一款高效的 Excel 文件比较工具就显得尤为重要。 本文将为您介绍一款功能强大、优势明显的 Exc…

基于docker实现JMeter分布式压测

为什么需要分布式&#xff1f; 在工作中经常需要对一些关键接口做高QPS的压测&#xff0c;JMeter是由Java 语言开发&#xff0c;没创建一个线程&#xff08;虚拟用户&#xff09;&#xff0c;JVM默认会为每个线程分配1M的堆栈内存空间。受限于单台试压机的配置很难实现太高的并…

在Spring Boot中使用Thymeleaf开发Web页面

引言&#xff1a; 为啥写这篇文章呢&#xff1f;我明明就没怎么用过这个Thymeleaf进行web开发&#xff0c;用JSP也行&#xff0c;三剑客也行&#xff0c;或者Vue&#xff0c;React&#xff0c;PHP等等&#xff0c;不好吗&#xff1f; 那我为啥写这篇博客呢&#xff1f;这个写了…

七天.NET 8操作SQLite入门到实战 - 第三天SQLite快速入门

前言 今天我们花费一个小时快速了解SQLite数据类型、SQLite常用命令和语法。 七天.NET 8操作SQLite入门到实战详细教程 第一天 SQLite 简介第二天 在 Windows 上配置 SQLite环境 EasySQLite项目源码地址 GitHub地址&#xff1a;https://github.com/YSGStudyHards/EasySQLite&…

spark shuffle 剖析

ShuffleExchangeExec private lazy val writeMetrics SQLShuffleWriteMetricsReporter.createShuffleWriteMetrics(sparkContext)private[sql] lazy val readMetrics SQLShuffleReadMetricsReporter.createShuffleReadMetrics(sparkContext)用在了两个地方&#xff0c;承接的是…

WorkPlus实现完全私有化部署,企业数据安全有保障

在这个信息化飞速发展的时代&#xff0c;企业正面临着越来越多的数据安全挑战。为了确保数据的安全性和隐私性&#xff0c;WorkPlus迎合市场需求&#xff0c;推出了完全私有化部署方案&#xff0c;为企业提供了全面、可靠的安全保障&#xff0c;成为企业移动办公的首选。 WorkP…

docker报错standard init linux.go:228 exec user process caused: exec format error

1、报错 使用Dockerfile自己做的服务镜像&#xff0c;docker run时启动失败&#xff0c;报错如下&#xff1a; standard init linux.go:228 exec user process caused: exec format error2、原因一 当前服务器的CPU架构和构建镜像时的CPU架构不兼容。比如做镜像是在arm机器下…

如何使用rclone将腾讯云COS桶中的数据同步到华为云OBS

在多云策略与数据迁移趋势下&#xff0c;企业往往需要将数据在不同云服务提供商之间进行迁移。本文介绍如何使用rclone工具同步腾讯云COS&#xff08;Cloud Object Storage&#xff09;桶中的数据到华为云OBS&#xff08;Object Storage Service&#xff09;。先决条件是您已经…