2140 解决智力问题

·   ·   ·   ·

  ·   ·


题目链接

2140. 解决智力问题

分析

定义 $dp[i]$ 为解决前 $i$ 道题目可以获得的最大分数,我们发现由于每道题的 $brainpower$ 不固定,我们求解 $dp[i]$ 时要遍历 $j \in [0, i - 1]$ 的所有 $dp[j]$,那么时间复杂度将会是 $O(n^2)$

考虑从后往前遍历,定义 $dp[i]$ 为解决从 $i$ 往后的所有问题可以得到的最大分数

得状态转移方程 $dp[i] = max(dp[i + 1],\ dp[min(n,\ i + brainpower[i] + 1)]$

最终答案为 $dp[0]$

代码实现

class Solution {
public:
    long long mostPoints(vector<vector<int>>& questions) {
        int n = questions.size();
        vector<long long> dp(n + 1, 0);

        for(int i = n - 1; ~i; --i) {
            int point = questions[i][0], brainpower = questions[i][1];
            dp[i] = max(dp[i + 1], point + dp[min(n, brainpower + i + 1)]);
        }

        return dp[0];
    }
};

复杂度分析

  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(n)$