2140.Solving Questions With Brainpower === ###### tags: `Medium`,`Array`,`DP` [2140. Solving Questions With Brainpower](https://leetcode.com/problems/solving-questions-with-brainpower/) ### 題目描述 You are given a **0-indexed** 2D integer array `questions` where `questions[i]` = [$points_i$, $brainpower_i$]. The array describes the questions of an exam, where you have to process the questions **in order** (i.e., starting from question `0`) and make a decision whether to **solve** or **skip** each question. Solving question `i` will **earn** you $points_i$ points but you will be **unable** to solve each of the next $brainpower_i$ questions. If you skip question `i`, you get to make the decision on the next question. * For example, given `questions = [[3, 2], [4, 3], [4, 4], [2, 5]]`: * If question `0` is solved, you will earn `3` points but you will be unable to solve questions `1` and `2`. * If instead, question `0` is skipped and question `1` is solved, you will earn `4` points but you will be unable to solve questions `2` and `3`. Return *the **maximum** points you can earn for the exam*. ### 範例 **Example 1:** ``` Input: questions = [[3,2],[4,3],[4,4],[2,5]] Output: 5 Explanation: The maximum points can be earned by solving questions 0 and 3. - Solve question 0: Earn 3 points, will be unable to solve the next 2 questions - Unable to solve questions 1 and 2 - Solve question 3: Earn 2 points Total points earned: 3 + 2 = 5. There is no other way to earn 5 or more points. ``` **Example 2:** ``` Input: questions = [[1,1],[2,2],[3,3],[4,4],[5,5]] Output: 7 Explanation: The maximum points can be earned by solving questions 1 and 4. - Skip question 0 - Solve question 1: Earn 2 points, will be unable to solve the next 2 questions - Unable to solve questions 2 and 3 - Solve question 4: Earn 5 points Total points earned: 2 + 5 = 7. There is no other way to earn 7 or more points. ``` **Constraints**: * 1 <= `questions.length` <= 10^5^ * `questions[i].length` == 2 * 1 <= $points_i$, $brainpower_i$ <= 10^5^ ### 解答 #### Javascript ```javascript= function mostPoints(questions) { const n = questions.length - 1; const dp = new Array(n).fill(0); dp[n] = questions[n][0]; for (let i = n - 1; i >= 0; i--) { const [point, brainpower] = questions[i]; if (i + brainpower + 1 > n) { dp[i] = Math.max(dp[i + 1], point); } else { dp[i] = Math.max(dp[i + 1], dp[i + brainpower + 1] + point); } } return dp[0]; } ``` > 第一次錯是沒注意到brainpower應該要從後面往回看才對 > 第二次錯是沒注意到brainpower要+1 > 不過這個跑測試就發現了應該不算錯吧ㄏㄏ > > [name=Marsgoat][time=May 12, 2023] #### Python ```python= class Solution: def mostPoints(self, questions: List[List[int]]) -> int: n = len(questions) dp = [0] * n dp[-1] = questions[-1][0] for i in range(n - 2, -1, -1): dp[i], skip = questions[i] if i + skip + 1 < n: dp[i] += dp[i + skip + 1] dp[i] = max(dp[i], dp[i + 1]) return dp[0] ``` > [name=Yen-Chi Chen][time=Fri, May 12, 2023] #### C# ```csharp= public long MostPoints(int[][] questions) { int size = questions.Length; long[] points = new long[size]; points[^1] = questions[^1][0]; for (int i = size - 2; i >= 0; i--) { points[i] = questions[i][0]; int skipedIndex = i + questions[i][1] + 1; if (skipedIndex < size) { points[i] += points[skipedIndex]; } points[i] = Math.Max(points[i], points[i + 1]); } return points[0]; } ``` > [name=Jim][time=May 13, 2023] ### Reference [回到題目列表](https://hackmd.io/@Marsgoat/leetcode_every_day)