Try   HackMD

2140.Solving Questions With Brainpower

tags: Medium,Array,DP

2140. Solving Questions With Brainpower

題目描述

You are given a 0-indexed 2D integer array questions where questions[i] = [

pointsi,
brainpoweri
].

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

pointsi points but you will be unable to solve each of the next
brainpoweri
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 <= 105
  • questions[i].length == 2
  • 1 <=
    pointsi
    ,
    brainpoweri
    <= 105

解答

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
不過這個跑測試就發現了應該不算錯吧ㄏㄏ

MarsgoatMay 12, 2023

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]

Yen-Chi ChenFri, May 12, 2023

C#

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

Reference

回到題目列表