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

Leetcode 3562. Maximum Profit from Trading Stocks with Discounts

  • Leetcode 3562. Maximum Profit from Trading Stocks with Discounts
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3562. Maximum Profit from Trading Stocks with Discounts

1. 解题思路

这一题没有搞定,思路上整体走偏了,看了一下别人的解答,结合deepseek的回答看了半天,终于是搞明白了里面的道道,也是醉了……

这一题我自己的思路就是一个遍历,分别考察每一个用户买与不买的情况下budget的变化以及对其下属员工price的变动,但是遇到了超时的问题。

然后deepseek给到的解答是视为一个背包问题,即不是考察每个员工买不不买的情况,而是考察给每一个员工及其下属员工分配多少的预算,然后看其最大能获得多大的利润。即,给到的最终的动态规划的数组为dp[uid][status][budget],其中,uid表示用户id;status表示其父节点的购买状态,即直属上司是否有购买行为;budget表示给该用户及其下属所有员工分配的budget;然后dp[uid][status][budget]整体表示当uid用户的直属上司的购买状态为status时,给他及其下属所有员工分配budget预算时,能够获得的最大的profit。

由此一来,我们就可以使用动态规划进行处理了。

2. 代码实现

给出python代码实现如下:

class Solution:def maxProfit(self, n: int, present: List[int], future: List[int], hierarchy: List[List[int]], budget: int) -> int:tree = defaultdict(list)for u, v in hierarchy:tree[u - 1].append(v - 1)@lru_cache(None)def dp(u):'''input: u : int -> 0-based user idoutput: - dp0: [int] * (budget+1) -> max profit for each budget if parent node was not bought- dp1: [int] * (budget+1) -> max profit for each budget if parent node was bought'''child_dp = [dp(v) for v in tree[u]]dp0 = [0] * (budget+1) # parent not buydp1 = [0] * (budget+1) # parent buyfor parent_bought, max_profits in [(0, dp0), (1, dp1)]:cost = present[u] if parent_bought == 0 else present[u] // 2profit = future[u] - costdpA = [0] + [-math.inf] * (budget) # u not buydpB = [-math.inf] * (budget+1) # u buyif cost <= budget:dpB[cost] = profitfor case0, case1 in child_dp:new_dpA = [-math.inf] * (budget+1) # u not buyfor bgt in range(budget+1):if dpA[bgt] == -math.inf:continuefor k in range(budget-bgt+1):if case0[k] == -math.inf:continuenew_dpA[bgt+k] = max(new_dpA[bgt+k], dpA[bgt] + case0[k])dpA = new_dpAnew_dpB = [-math.inf] * (budget+1) # u buyfor bgt in range(budget+1):if dpB[bgt] == -math.inf:continuefor k in range(budget-bgt+1):if case1[k] == -math.inf:continuenew_dpB[bgt+k] = max(new_dpB[bgt+k], dpB[bgt] + case1[k])dpB = new_dpBfor bgt in range(budget+1):max_profits[bgt] = max(dpA[bgt], dpB[bgt])return dp0, dp1max_profits, _ = dp(0)return max(max_profits)

提交代码评测得到:耗时2362ms,占用内存22.8MB。

http://www.xdnf.cn/news/9054.html

相关文章:

  • 视频检测AI智能分析网关V4摄像头异常位移检测算法全场景智能防护方案
  • “_snprintf”: 不是“std”的成员
  • 【监控】Blackbox Exporter 黑盒监控
  • word的页眉页脚设置
  • 数据库的索引概述与常见索引结构
  • Unity性能优化
  • C++(4)
  • 解锁 Linux 内核潜能:高效参数调优实战指南
  • 《软件工程》第 3 章 -需求工程概论
  • vector的实现
  • TypeScript 针对 iOS 不支持 JIT 的优化策略总结
  • 裁判模型的定义与训练
  • 单片机简介
  • Postman基础操作
  • Vue 2 混入 (Mixins) 的详细使用指南
  • 如何通过AI辅助数据分析
  • leetcode-295 Find Median from Data Stream
  • 【科研绘图系列】R语言绘制柱状图(bar plot)
  • Vue中的 VueComponent
  • pytorch简单线性回归模型
  • 如何轻松地将文件从 iPhone 传输到 PC
  • Python基础教程:从零开始学习编程 - 第1-3天
  • 全光网络ICU床旁监护系统:重新定义重症监护的智慧中枢
  • python入门day01
  • UE5 Niagara Advance 学习笔记
  • git学习笔记
  • matlab实现激光腔长计算满足热透镜效应
  • JAVA 学习日志
  • 防火墙的SD-WAN功能
  • JAVA基础编程练习题--50道