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)