Solving Questions With Brainpower

Updated on 14 July, 2025
Solving Questions With Brainpower header image

Problem Statement

In this problem, we are given a 2D integer array questions, indexed from 0, where each subarray questions[i] contains two integers. The first integer, pointsi, represents the points you earn if you choose to solve the i-th question; the second integer, brainpoweri, indicates how many subsequent questions you cannot solve if you decide to tackle question i due to the required recovery time from exerting the effort. The challenge is to traverse this series of questions, making a choice for each whether to attempt it and gain its points while skipping the next few, dictated by its brainpower value, or to skip it and keep your options open for the following questions. The ultimate goal is determining the maximum possible total points accumulated by making the optimal choices throughout the series.

Examples

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

Approach and Intuition

The strategy to tackle this problem needs a good balance between immediate gains and long-term benefits. Since the problem includes the dynamic of skipping questions based on a decision made (solving a question), it leads us toward a dynamic programming approach or recursion with memoization.

  1. Defining the State and Decisions:

    • Let dp[i] represent the maximum points that can be earned from the i-th question onward.
    • For each question i, we have two choices:
      • Solve the question and then skip the next brainpoweri questions.
      • Skip the question and consider the next question.
  2. Formulating the Transition:

    • If you solve the question i:
      • You earn pointsi, and the next possible question to consider would be i + brainpoweri + 1.
      • So, dp[i] would be pointsi + dp[i + brainpoweri + 1] if you choose to solve question i (considering you can go beyond the list length).
    • If you decide to skip i:
      • Simply move to the next question, and dp[i] would be dp[i + 1].
    • We then take the maximum of these two strategies for every question i.
  3. Implementation Outline:

    • Initialize a dp array where dp[i] initially stands for maximum points from i to end.
    • Start filling the dp array from the last question backwards to the first.
    • For each question, compute the points as explained in the transition steps.
    • Finally, dp[0] will hold the maximum points possible from question 0 to the end following the optimal decision path.

This dynamic programming formulation ensures that each decision leverages the best possible outcomes previously computed for following questions, therefore constructing an optimal solution iteratively by reusing solutions of already solved subproblems. The result is an efficient computation that avoids the excessive overhead of a purely recursive approach.

Solutions

  • Java
java
class Solution {
    long memo[];
    
    private long solve(int[][] queries, int idx) {
        if (idx >= queries.length) {
            return 0;
        }
        if (memo[idx] != 0) {
            return memo[idx];
        }
        long score = queries[idx][0];
        int jump = queries[idx][1];
    
        memo[idx] = Math.max(score + solve(queries, idx + jump + 1), solve(queries, idx + 1));
        return memo[idx];
    }
    
    public long maxPoints(int[][] queries) {
        int length = queries.length;
        memo = new long[length];
            
        return solve(queries, 0);
    }
}

The provided Java code defines a solution to the problem of optimizing the score you can achieve given a set of tasks where each task has associated points and a jump value. The jump value determines the number of subsequent tasks to skip if that task is chosen. Here's a breakdown of the code's functionality:

  • Memoization Array: Implement memoization using an array memo[] to store results of subproblems and avoid redundant calculations.

  • solve Method: This is a recursive function, implementing the core logic:

    • Base Case: If the index goes beyond the number of tasks, it returns 0 because no more tasks are left to process.
    • Memoization Check: Return the stored value if the solution for the current index is already computed.
    • It calculates the maximum points for choosing the current task and skipping the next jump + 1 tasks or skipping the current task altogether.
  • maxPoints Method: This initializes the memoization array based on the number of tasks. It starts the recursive solve function from the first task (index 0).

  • Recursive Approach with Optimization: The function utilizes a top-down dynamic programming approach by combining recursion for exploring choices (pick this task or skip it) and memoization for storing intermediate results, ensuring efficiency by avoiding recomputation.

  • Mathematical Operations: Determines the maximum score by using the Math.max function, comparing the score of including the current task plus recursively solved score of tasks after the jump with merely the recursively solved score of the next task.

By employing memoization and recursion, this code efficiently addresses the potentially exponential complexity of choosing tasks with associated skipping, narrowing it down to a more manageable problem solved in polynomial time because each state of the problem (task index) is solved just once.

  • Python
python
class Solution:
    def maximumPoints(self, questions: List[List[int]]) -> int:     
        count = len(questions)
        scores = [0] * count
            
        def calculate_max(i):
            if i >= count:
                return 0
            if scores[i]:
                return scores[i]
            reward, jump = questions[i]
    
            # scores[i] = maximum of skipping or solving the question
            scores[i] = max(calculate_max(i + 1), reward + calculate_max(i + jump + 1))
            return scores[i]
            
        return calculate_max(0)

This Python solution tackles the "Solving Questions With Brainpower" problem using dynamic programming in a recursion-based approach.

  • The function maximumPoints calculates the maximum points one can achieve from a list of questions. Each question is represented as a list containing its reward points and the number of questions one must skip if answered.
  • A list named scores tracks the maximum score achievable from each question to avoid recalculating answers, a technique known as memoization.
  • The calculate_max function is defined inside maximumPoints and serves as a recursive helper function. It uses two base conditions:
    • If the index i exceeds the length of the list, meaning all questions have been considered, it returns 0.
    • If the current index's solution is already computed (scores[i]), it returns the stored value to prevent redundant calculations.
  • At each question, it calculates the maximum points by considering two scenarios:
    • Skipping the current question by calling itself with i+1.
    • Taking the current question, adding its reward to the result of a recursive call that skips the next jump questions (i.e., calculate_max(i + jump + 1)).
    • The maximum of these two values is then stored in scores[i].
  • The function starts the recursion from the first question and the result of calculate_max(0) provides the maximum score achievable.

This approach efficiently solves the problem by considering each question, storing intermediate results, and making decisions based on maximizing points using either a recursive call to consider or skip upcoming questions.

Comments

No comments yet.