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

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

题目: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.kler.cn/a/522901.html

相关文章:

  • ORA-04031 错误
  • OpenCV:形态学操作总结
  • 力扣【669. 修剪二叉搜索树】Java题解
  • 【Elasticsearch】RestClient操作文档
  • 【Linux探索学习】第二十七弹——信号(一):Linux 信号基础详解
  • Nginx 安装配置指南
  • 10 款《医学数据库和期刊》查阅网站
  • Lesson 119 A true story
  • 蓝桥杯模拟算法:多项式输出
  • 【Prometheus】Prometheus如何监控Haproxy
  • 菜鸟之路Day09一一集合进阶(二)
  • 【公因数匹配——暴力、(质)因数分解、哈希】
  • Github 2025-01-27 开源项目周报 Top15
  • 第 4 章:游戏逻辑与状态管理
  • 【微服务与分布式实践】探索 Sentinel
  • 使用 postman 测试思源笔记接口
  • Excel中LOOKUP函数的使用
  • 重回C语言之老兵重装上阵(十五)C语言错误处理
  • v3s传memory
  • 数论问题73
  • xceed PropertyGrid 如何做成Visual Studio 的属性窗口样子
  • kaggle比赛入门 - House Prices - Advanced Regression Techniques(第三部分)
  • mapstruct入门
  • 【Linux】IPC:匿名管道、命名管道、共享内存
  • 智能课堂点名系统:从零实现一个高效课堂管理工具
  • 基于SpringBoot的高校志愿活动服务平台