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

LeetCode 3180. 执行操作可获得的最大总奖励 I

LeetCode 3180. 执行操作可获得的最大总奖励 I
LeetCode 3181. 执行操作可获得的最大总奖励 II 题干相同,仅仅数据量不一样

给你一个整数数组 rewardValues,长度为 n,代表奖励的值。
最初,你的总奖励 x 为 0,所有下标都是 未标记 的。你可以执行以下操作 任意次 :
从区间 [0, n - 1] 中选择一个 未标记 的下标 i。
如果 rewardValues[i] 大于 你当前的总奖励 x,则将 rewardValues[i] 加到 x 上(即 x = x + rewardValues[i]),并 标记 下标 i。
以整数形式返回执行最优操作能够获得的 最大 总奖励。
示例 1:
输入:rewardValues = [1,1,3,3]
输出:4
解释:
依次标记下标 0 和 2,总奖励为 4,这是可获得的最大值。

二维动态规划

class Solution:def maxTotalReward(self, rewardValues: List[int]) -> int:# dp[i][j]表示从0到i的奖励中能否获得奖励j# dp[i][j] = 前i-1个可以获得j,或者,dp[i-1][j-rewardValues[i]]为TruerewardValues.sort()n = len(rewardValues)k = 2 * max(rewardValues)dp = [[False] * k for _ in range(n)]dp[0][0] = Truedp[0][rewardValues[0]] = Truefor i in range(1, n):for j in range(k):dp[i][j] = dp[i - 1][j]if j - rewardValues[i] > -1 and j - rewardValues[i] < rewardValues[i]:dp[i][j] |= dp[i - 1][j - rewardValues[i]]for i in range(k - 1, -1, -1):if dp[n - 1][i]:return i

时间复杂度:O(nlogn + nk)
空间复杂度:O(logn + nk)

使用滚动数组优化

class Solution:def maxTotalReward(self, rewardValues: List[int]) -> int:# dp[i][j]表示从0到i的奖励中能否获得奖励j# dp[i][j] = 前i-1个可以获得j,或者,dp[i-1][j-rewardValues[i]]为TruerewardValues.sort()n = len(rewardValues)k = 2 * max(rewardValues)dp = [[False] * k for _ in range(2)]dp[0][0] = Truedp[0][rewardValues[0]] = Truefor i in range(1, n):for j in range(k):dp[i % 2][j] = dp[(i - 1) % 2][j]if j - rewardValues[i] > -1 and j - rewardValues[i] < rewardValues[i]:dp[i % 2][j] |= dp[(i - 1) % 2][j - rewardValues[i]]for i in range(k - 1, -1, -1):if dp[(n - 1) % 2][i]:return i

还能省

class Solution:def maxTotalReward(self, rewardValues: List[int]) -> int:# dp[i][j]表示从0到i的奖励中能否获得奖励j# dp[i][j] = 前i-1个可以获得j,或者,dp[i-1][j-rewardValues[i]]为TruerewardValues.sort()n = len(rewardValues)k = 2 * max(rewardValues)dp = [False] * kdp[0] = Truedp[rewardValues[0]] = Truefor i in range(1, n):for j in range(k - 1, -1, -1):if j - rewardValues[i] > -1 and j - rewardValues[i] < rewardValues[i]:dp[j] |= dp[j - rewardValues[i]]for i in range(k - 1, -1, -1):if dp[i]:return i

if条件还能优化一点

class Solution:def maxTotalReward(self, rewardValues: List[int]) -> int:# dp[i][j]表示从0到i的奖励中能否获得奖励j# dp[i][j] = 前i-1个可以获得j,或者,dp[i-1][j-rewardValues[i]]为TruerewardValues.sort()n = len(rewardValues)k = 2 * max(rewardValues)dp = [False] * kdp[0] = Truedp[rewardValues[0]] = Truefor i in range(1, n):for j in range(rewardValues[i] * 2 - 1, rewardValues[i]-1, -1):dp[j] |= dp[j - rewardValues[i]]for i in range(k - 1, -1, -1):if dp[i]:return i

布尔dp可以通过转为二进制整体运算省取一层循环
放大招,使用位运算替代了第二层循环

class Solution:def maxTotalReward(self, rewardValues: List[int]) -> int:rewardValues.sort()n = len(rewardValues)k = 2 * max(rewardValues)dp = 1dp |= 1 << (rewardValues[0])for i in range(1, n):dp |= (dp & ((1 << rewardValues[i]) - 1)) << rewardValues[i]return dp.bit_length() - 1

http://www.mrgr.cn/news/59099.html

相关文章:

  • Web应用框架-Django应用基础(3)-Jinja2
  • JS实现警灯效果红蓝闪烁
  • C++《vector》
  • Threejs 实现3D 地图(06)3d 地图飞线动画
  • 零基础Java第十期:类和对象(一)
  • echarts实现 水库高程模拟图表
  • 有没有两个不相等的对象有相同的 hashCode
  • 【jvm】什么是TLAB
  • 李沐读论文-启发与借鉴-3:Attention is all you need
  • 【Nas】X-DOC:在Mac OS X 中使用 WOL 命令唤醒局域网内 PVE 主机
  • 四、Hadoop 命令高级用法深度剖析
  • 基于SSM框架、传统文化学习系统的设计与实现
  • Lampiao靶机入侵实战
  • springboot多模块打包时出现Could not resolve dependencies for project
  • 构建负责任的人工智能:数据伦理与隐私保护
  • 牛客周赛 Round 64(博弈论、思维、构造、LCA、换根DP)
  • 信息咨询试题
  • nfs实验
  • Redis学习文档(常见面试题)
  • 基于SSM+小程序的垃圾分类管理系统(垃圾3)
  • P450催化的联芳基偶联反应-文献精读72
  • 【专题】计算机网络之数据链路层
  • 「二叉树进阶题解:构建、遍历与结构转化全解析」
  • 【Linux系统】进程终止
  • Elasticsearch安装使用
  • Python数值计算(33)——simpson 3/8积分公式