Medium
,Array
,DP
2140. Solving Questions With Brainpower
You are given a 0-indexed 2D integer array questions
where questions[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 i
, you get to make the decision on the next question.
questions = [[3, 2], [4, 3], [4, 4], [2, 5]]
:
0
is solved, you will earn 3
points but you will be unable to solve questions 1
and 2
.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:
questions.length
<= 105questions[i].length
== 2
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
不過這個跑測試就發現了應該不算錯吧ㄏㄏMarsgoatMay 12, 2023
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]
Yen-Chi ChenFri, May 12, 2023
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];
}
JimMay 13, 2023