2140.解决智力问题
方法思路
本题可以通过动态规划来解决,其思路类似于背包问题中的选择与不选择当前物品的决策。每个问题可以选择解决或不解决,解决当前问题会获得分数,但必须跳过后续若干个问题。我们需要通过动态规划来记录每个位置的最大分数,从而得到最终结果。
类比背包问题
在背包问题中,每个物品可以选择拿或不拿,拿的话会占用一定容量并获得价值。这里的问题类似,每个问题可以选择解决或不解决,解决的话会获得分数,但必须跳过后续若干个问题,相当于占用了后续的位置。因此,我们可以将每个问题视为一个物品,其价值为对应的分数,而选择该物品会影响后续物品的选择。
解决思路
- 状态定义:定义
f[i]
表示处理到第i
个问题时的最大分数。 - 状态转移:
- 不解决当前问题:此时最大分数直接传递到下一个问题,即
f[i+1] = max(f[i+1], f[i])
。 - 解决当前问题:获得当前问题的分数,并跳过后续若干个问题,更新对应位置的最大分数。具体来说,解决第
i
个问题后,下一个可处理的问题位置为j = i + brainpower + 1
,这里需要确保j
不超过总问题数n
。然后更新f[j] = max(f[j], f[i] + score)
。
- 不解决当前问题:此时最大分数直接传递到下一个问题,即
- 初始化:
f[0]
初始化为 0,表示初始状态没有处理任何问题时的分数为 0。 - 结果:最终结果为
f[n]
,即处理完所有问题后的最大分数。
复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(n)
解决代码
1 | class Solution { |
代码解释
- 初始化:
dp
数组长度为n + 1
,初始值均为 0。 - 遍历每个问题:对于每个问题
i
,首先处理不解决的情况,将当前最大分数传递到下一个位置。 - 处理解决当前问题的情况:计算下一个可处理的问题位置
j
,并更新该位置的最大分数。 - 返回结果:最终结果存储在
dp[n]
中,表示处理完所有问题后的最大分数。 - 注意:数组
dp[n]
需要用long才能通过全部样例。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 YY's blog!