leetcode 2920. 收集所有金币可获得的最大积分

server/2025/1/24 15:49:48/

题目:2920. 收集所有金币可获得的最大积分 - 力扣(LeetCode)

看数据范围是需要O(n*log(n))的算法。可以用dfs+记忆化搜索。

考虑到coins[i]的范围是[0, 10000],最多除个十几次2就变成0了。所以用w[i][j]表述节点i在除以j次后,以i为根节点的子树的最大值,来进行dfs的记忆化。

struct Node {vector<Node*> links;vector<Node*> children;int idx;int* val = new int[16];int* w = new int[16];bool* f = new bool[16];Node(int idx, int v) {this->idx = idx;memset(f, 0, 16);val[0] = v;for (int i = 1; i < 16; i++) {val[i] = val[i - 1] / 2;}}void Build(int parent = -1) {for (int i = 0; i < links.size(); i++) {if (links[i]->idx != parent) {children.push_back(links[i]);links[i]->Build(idx);}}}int DFS(int t, int k) {if (t >= 16) {return 0;}if (f[t]) {return w[t];}int a = (t < 16 ? val[t] : 0) - k;for (int i = 0; i < children.size(); i++) {a += children[i]->DFS(t, k);}int b = t < 15 ? val[t + 1] : 0;for (int i = 0; i < children.size(); i++) {b += children[i]->DFS(t + 1, k);}f[t] = true;w[t] = max(a, b);return w[t];}
};
class Solution {
public:int maximumPoints(vector<vector<int>>& edges, vector<int>& coins, int k) {vector<Node*> tree;for (int i = 0; i < coins.size(); i++) {tree.push_back(new Node(i, coins[i]));}int a, b;for (int i = 0; i < edges.size(); i++) {a = edges[i][0];b = edges[i][1];tree[a]->links.push_back(tree[b]);tree[b]->links.push_back(tree[a]);}tree[0]->Build();return tree[0]->DFS(0, k);}
};


http://www.ppmy.cn/server/161052.html

相关文章

上位机知识篇---ROS2命令行命令静态链接库动态链接库

文章目录 前言第一部分&#xff1a;ROS2命令行命令1. 基础命令&#xff08;1&#xff09;ros2 run&#xff08;2&#xff09;ros2 launch&#xff08;3&#xff09;ros2 node&#xff08;4&#xff09;ros2 topic&#xff08;5&#xff09;ros2 service&#xff08;6&#xff0…

基于微信小程序的健身管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

Android 极光推送快速开发集成指南(1)

<activity android:name“cn.jpush.android.ui.PushActivity” android:configChanges“orientation|keyboardHidden” android:exported“false” android:theme“android:style/Theme.NoTitleBar” tools:ignore“DuplicateActivity”> <activity android:nam…

PyQt5之QLCDNumber

1. 描述 展示LCD样式的数字&#xff0c;它可以显示几乎任何大小的数字&#xff0c;可以显示十进制&#xff0c;十六进制&#xff0c;八进制或二进制数。 继承自QFrame 2.功能作用 (1) 构造函数 QLCDNumber(parent: QWidget None) QLCDNumber(int, parent: QWidget None)…

【Arduino】语言参考功能

前言 翻译Arduino 参考处列出的常用函数。文中为了减少篇幅&#xff0c;达到能快速翻到查询的目标&#xff0c;在介绍函数中&#xff0c;对部分内容进行了省略&#xff0c;不会列出函数输入参数类型&#xff0c;以及使用注意事项等等&#xff0c;所以若是首次使用或者是调试时出…

我的创作纪念日,纪念我的第512天

目录 年末 年初 入围 博客 变动 生活 期待 年末 很快&#xff0c;2024年已经过去了&#xff0c;本想在跨年夜的时候营造一点小小的仪式感&#xff0c;结果也因为身体的原因放弃了&#xff0c;浑身感觉疼痛&#xff0c;躺在床上&#xff0c;闭上眼睛&#xff0c;什么也不…

算力需求大爆发,谁是“大推手”?

大约5亿年前&#xff0c;地球迎来了物种的突然大爆发&#xff0c;标志着生物进化除了缓慢渐变&#xff0c;还可能以跳跃的方式进行。 同样&#xff0c;人工智能在经历70余年曲折发展之后&#xff0c;也处于一个极为关键的时刻&#xff0c;在模型、数据、算力等各项基础技术多年…

Jmeter 动态参数压力测试时间段预定接口

&#x1f3af; 本文档详细介绍了如何使用Apache JMeter进行压力测试&#xff0c;以评估预定接口在高并发场景下的性能表现。通过创建线程组模拟不同数量的用户并发请求&#xff0c;利用CSV文件动态配置时间段ID和用户token&#xff0c;确保了测试数据的真实性和有效性。文档中还…