链接: https://leetcode-cn.com/problems/solving-questions-with-brainpower/
题意
给你一个下标从 0 开始的二维整数数组 questions ,其中$questions[i] = [pointsi, brainpoweri]$
这个数组表示一场考试里的一系列题目,你需要 按顺序 ,针对每个问题选择解决或者跳过操作。解决问题 i 将让你获 pointsi 的分数,但是你只能跳过接下来的 brainpoweri 个问题。如果你跳过问题 i ,你可以对下一个问题决定使用哪种操作。
求这场考试里你能获得的 最高 分数。
解法
一眼dp
但是周赛的时候写了一个小时也没完全写对
果然我需要解决一下智力问题
我是废物.jpg
一开始考虑dp[i]表示解决到第i个问题可以获得的最大分数
但是发现状态转移的时候 我没法知道前一个最大分数的位置在哪里
所以就时间复杂度O(n^2)卡住了
记忆化搜索也没有写出来 直接dfs超时
场面陷入困境
正解是倒序dp,令dp[i]表示从第i个问题到最后一个问题可以获得的最大分数
如果不做当前题目dp[i + 1]
做的话questions[i][0] + dp[i + questions[i][1] + 1]
取两者的较大值即可
但其实也可以正序dp做
只是在每次做第i个问题的时候 更新的是下一个不被跳过的问题的dp值
对于超出索引的情况,我们可以将其更新到一个特殊的值 dp[n]中
表示当前问题做了且为最后一个问题
代码
记忆化搜索
1 | class Solution { |
倒序dp(最推荐)
1 | long long mostPoints(vector<vector<int>>& questions) { |
正序dp
1 | long long mostPoints(vector<vector<int>>& questions) { |