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.hqwc.cn/news/211244.html

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

相关文章

EMG肌肉电信号处理合集(三)

本文主要展示常见的肌电信号预处理的实现&#xff0c;开发环境为matlab。 目录 1 肌电信号低通&#xff0c;高通&#xff0c;带通滤波 2 去除DC 0阶偏置&#xff0c;1阶偏置 3 全波整流 4 信号降采样 5 linear envolope / butterworth 低通滤波器 1 肌电信号低通&#xf…

Exception in thread “消费者“ java.lang.IllegalMonitorStateException

这两天学习生产者消费者模型的时候&#xff0c;使用Java线程来实现&#xff0c;出现了一个问题“Exception in thread "消费者" java.lang.IllegalMonitorStateException”&#xff0c;并且&#xff0c;线程不结束。报错图片如下&#xff1a; 那我们怎么解决呢&…

【无标题】学习HTML

由于工作需求&#xff0c;学习了一些html的相关知识&#xff0c;最终应用到打印功能上使用。 HTML是指超文本标记语言&#xff08;HyperText Markup Language&#xff09;。它是一种用于创建和呈现互联网上页面的标准标记语言。HTML是Web开发的基础&#xff0c;是构建网页和应…

QEMU Guest Agent本地提权漏洞处理(CVE-2023-0664)

一、漏洞描述 QEMU Guest Agent&#xff08;qga&#xff09;类似于vmware中的 vmtools&#xff0c;相关安全报告显示它的Windows版本安装程序存在本地提权高危漏洞&#xff08;CVE-2023-0664&#xff09;&#xff0c;攻击者可利用该漏洞进行本地权限提升&#xff0c;获得SYSTE…

Java互联网+医院智能导诊系统源码 自动兼容H5小程序、Uniapp

随着信息和通信技术的进步,智能和移动技术越来越普遍,尤其在医疗保健领域,一些新型卫生信息系统被不断开发出来支持医院和其他卫生保健组织的管理和运作。 智能导诊系统是嵌入到医院和医疗保健卫生中心 HIS系统中的一种专门导诊系统,通过智能语音交互的方式帮助用户完成导诊、分…

【Mysql学习笔记】3 - 本章作业

1.判断 1. 这句话表示ename as name 可以不要这个as&#xff0c;同理后面的sal salary也是别名&#xff0c;而选项D的Annual Salary中间也有空格&#xff0c;程序会判断为as 但as不能连用&#xff0c;所以错误&#xff0c;选D 2.选B&#xff0c;因为null不能加上判断符号<&…

行情分析 - - 加密货币市场大盘走势(11.23)

大饼昨日又开始了回调&#xff0c;因为FTF消息&#xff0c;而实际还是要下跌的&#xff0c;耐心等待即可。 空单策略&#xff1a;入场37300 止盈34000-33000 止损39000 以太昨日上涨也很激励&#xff0c;目前上涨打了止损&#xff0c;现在入场是好的机会&#xff0c;等待即可。…

揭开未来:塑造数字营销的尖端技术

介绍 对于企业来说&#xff0c;要想在瞬息万变的数字营销世界中取得成功&#xff0c;领先一步至关重要。技术正在以惊人的速度发展&#xff0c;开辟了新的机会&#xff0c;正在改变营销人员与消费者的互动方式。这篇文章的目的是重点介绍重新定义数字营销领域的十大创新技术。…

如何实现在公网下使用navicat图形化工具远程连接本地内网的MariaDB数据库

公网远程连接MariaDB数据库【cpolar内网穿透】 文章目录 公网远程连接MariaDB数据库【cpolar内网穿透】1. 配置MariaDB数据库1.1 安装MariaDB数据库1.2 测试局域网内远程连接 2. 内网穿透2.1 创建隧道映射2.2 测试随机地址公网远程访问3. 配置固定TCP端口地址3.1 保留一个固定的…

Linux常用命令指南以及shell脚本编程

常用快捷键 Tab键补齐命令CtrlA键光标移动到最前CtrlE键光标移动到最后CtrlU键清空当前输入的内容上/下键切换之前输入的命令 文件操作 cd test进入test目录cd…返回上一个目录cd.停留在当前目录 .代表当前目录ls显示当前文件夹下面的所有文件/文件夹等ls -all显示当前文件夹…

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

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