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

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。

相关文章:

  • CAD精简多段线顶点、优化、删除多余、重复顶点——CAD c#二次开发
  • 厚铜PCB线路板厂会如何处理质量问题?
  • 滑动窗口算法实时计算QPS:Java实现与原理分析
  • MAR:无需量化的掩码自回归图像生成模型
  • RuoYi前后端分离框架集成UEditorPlus富文本编辑器
  • 嵌入式学习(基本操作)day1
  • 在麒麟系统(Kylin OS)上安装`geckodriver`
  • 认识微服务
  • DNS 详情 新增 DNS 自适应服务器 ip
  • 【部署】在离线服务器的docker容器下升级dify-import程序
  • leetcode 3559. Number of Ways to Assign Edge Weights II
  • 【Hive基础】01.数据模型、存储格式、排序方式
  • 内网映射有什么作用,如何实现内网的网络地址映射到公网连接?
  • 【图像处理基石】什么是色彩模式?
  • 倚光科技在二元衍射面加工技术上的革新:引领光学元件制造新方向​
  • 佰力博科技与您探讨铁电分析仪具有哪些测试功能
  • 游戏引擎学习第313天:回到 Z 层级的工作
  • 聊天室H5实时群聊聊天室全开源系统(源码下载)
  • Lines of Thought in Large Language Models
  • 【自然语言处理与大模型】大模型(LLM)基础知识⑤
  • 火车票网站建设/sem是做什么的
  • 网站设计 培训/站长工具端口查询
  • wordpress sql过滤/杭州seo搜索引擎优化
  • 做网站赌博的/自己制作一个网页
  • 张店学校网站建设公司/好的产品怎么推广语言
  • 微信公众号设计与布局/重庆seo技术教程博客