力扣每日一题打卡 3180. 执行操作可获得的最大总奖励 I

给你一个整数数组 rewardValues,长度为 n,代表奖励的值。

最初,你的总奖励 x 为 0,所有下标都是未标记 的。你可以执行以下操作 任意次:

  • 从区间 [0, n - 1] 中选择一个 未标记 的下标 i。
  • 如果 rewardValues[i] 大于 你当前的总奖励 x,则将 rewardValues[i] 加到 x 上(即 x = x + rewardValues[i]),并标记 下标 i。

以整数形式返回执行最优操作能够获得的最大 总奖励。

这题目其实是个非常明显的背包问题,只不过是稍微改了一下的0-1背包问题,所以很明显是个动态规划(dp)题,但可惜我太久没写题目了,已经不会dp了。(不,明明是因为晚上的时候脑子不清醒转不动)

最后是稍微借助了一下题目下方的提示才写出来的。

dp嘛,能找到状态转移方程,题目就算解决一半了,所以重点在于我们的状态转移方程要怎么确定。

我们可以设计dpij=1表示我们有 i 个物品,可以获得 j 的奖励。那么,最后要求的就是dpn-1那一行最大的满足dpn-1j=1的 j 。

那dpi-1怎么的值要怎么转移到dpi呢?如果我们不选第i个物品,那肯定dpi=dpi-1。而如果我们要选第i个物品呢?我们知道,只有手上的奖励值比rewardValues[i]

的值小的时候,我们才可以

选择

首先,因为这个题只需要求最大的总奖励,对具体选的物品编号没有要求,所以我们完全可以先排个序,而且排序之后也可以更方便进行选择。

然后,因为每次选择的奖励值必须大于你手上的奖励值,所以我们绝对不可能选择两个奖励值一样的物品,所以我们可以对输入数据进行一次去重。

相关推荐
其实防守也摸鱼6 小时前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全
Nuanyt7 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
w_zero_one10 小时前
递归算法(一)
java·开发语言·算法
圣保罗的大教堂10 小时前
leetcode 3736. 最小操作次数使数组元素相等 III 简单
leetcode
文丑颜不良啊11 小时前
LeetCode1881~1990题目解析
java·leetcode
风影同志7832412 小时前
20 个比特能装下多少行情?——实测拆解 Kronos 的 K 线分词器
算法
写的都是BUG12 小时前
APK 里的钥匙,一直就放在门口:聊聊加固真正该做什么
前端·算法
lsc_blog12 小时前
年底还在招的岗位,先确认缺口和到岗要求
git·缓存·ci/cd·职场和发展·github
地平线开发者13 小时前
CLIP 的零样本分类:一组文本如何变成图像分类器?
算法