Bird
Raised Fist0
DSA Javascriptprogramming~10 mins

Overlapping Subproblems and Optimal Substructure in DSA Javascript - Interactive Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to return the nth Fibonacci number using recursion.

DSA Javascript
function fib(n) {
  if (n <= 1) return n;
  return fib(n - 1) [1] fib(n - 2);
}
Drag options to blanks, or click blank then click option'
A/
B-
C*
D+
Attempts:
3 left
💡 Hint
Common Mistakes
Using subtraction instead of addition in the recursive call.
Forgetting to return the sum of the two recursive calls.
2fill in blank
medium

Complete the code to use memoization for the Fibonacci function to avoid repeated calculations.

DSA Javascript
function fibMemo(n, memo = {}) {
  if (n in memo) return memo[n];
  if (n <= 1) return n;
  memo[n] = fibMemo(n - 1, memo) [1] fibMemo(n - 2, memo);
  return memo[n];
}
Drag options to blanks, or click blank then click option'
A-
B+
C*
D/
Attempts:
3 left
💡 Hint
Common Mistakes
Using subtraction or multiplication instead of addition.
Not storing the result in the memo object.
3fill in blank
hard

Fix the error in the code to correctly compute the minimum cost path in a grid using recursion and memoization.

DSA Javascript
function minCost(grid, i, j, memo = {}) {
  const key = i + ',' + j;
  if (key in memo) return memo[key];
  if (i === 0 && j === 0) return grid[0][0];
  if (i < 0 || j < 0) return Infinity;
  const up = minCost(grid, i - 1, j, memo);
  const left = minCost(grid, i, j - 1, memo);
  memo[key] = Math.min(up, left) [1] grid[i][j];
  return memo[key];
}
Drag options to blanks, or click blank then click option'
A+
B-
C*
D/
Attempts:
3 left
💡 Hint
Common Mistakes
Using subtraction or multiplication instead of addition.
Not using memoization key correctly.
4fill in blank
hard

Fill both blanks to create a dictionary comprehension that maps words to their lengths only if length is greater than 3.

DSA Javascript
const words = ['tree', 'sun', 'mountain', 'sky'];
const lengths = { [1]: [2] for (const word of words) if word.length > 3 };
Drag options to blanks, or click blank then click option'
Aword
Bword.length
Cword.toUpperCase()
Dword.length()
Attempts:
3 left
💡 Hint
Common Mistakes
Using word.length() which is not a function in JavaScript.
Using word.toUpperCase() as the key or value incorrectly.
5fill in blank
hard

Fill all three blanks to create an object that maps uppercase keys to values only if the value is greater than 10.

DSA Javascript
const data = { a: 5, b: 15, c: 20 };
const filtered = { [1]: [2] for (const [k, v] of Object.entries(data)) if v [3] 10 };
Drag options to blanks, or click blank then click option'
Ak.toUpperCase()
Bv
C>
D<
Attempts:
3 left
💡 Hint
Common Mistakes
Using < instead of > in the condition.
Not converting keys to uppercase.

Practice

(1/5)
1. Which of the following best describes the overlapping subproblems property in dynamic programming?
easy
A. The problem can be broken down into smaller subproblems that are solved multiple times.
B. The problem has a unique solution without repeating any subproblems.
C. The problem requires sorting before solving.
D. The problem can only be solved using recursion without memoization.

Solution

  1. Step 1: Understand overlapping subproblems

    Overlapping subproblems means the same smaller problems appear multiple times during solving.
  2. Step 2: Match with options

    The problem can be broken down into smaller subproblems that are solved multiple times. correctly states that subproblems repeat and can be reused to save time.
  3. Final Answer:

    The problem can be broken down into smaller subproblems that are solved multiple times. -> Option A
  4. Quick Check:

    Overlapping subproblems = repeated smaller problems [OK]
Hint: Look for repeated smaller problems solved multiple times [OK]
Common Mistakes:
  • Confusing overlapping subproblems with unique subproblems
  • Thinking sorting is required for all DP problems
  • Assuming recursion alone solves overlapping subproblems
2. Which of the following JavaScript function definitions correctly implements memoization for a Fibonacci function?
easy
A. function fib(n) { if (n <= 1) return n; return fib(n-1) + fib(n-2); }
B. const memo = {}; function fib(n) { if (n in memo) return memo[n]; if (n <= 1) return n; memo[n] = fib(n-1) + fib(n-2); return memo[n]; }
C. function fib(n) { let result = 0; for(let i=0; i
D. function fib(n) { return n * fib(n-1); }

Solution

  1. Step 1: Identify memoization pattern

    Memoization stores results in a cache object to avoid repeated calculations.
  2. Step 2: Check each option

    const memo = {}; function fib(n) { if (n in memo) return memo[n]; if (n <= 1) return n; memo[n] = fib(n-1) + fib(n-2); return memo[n]; } uses an object 'memo' to store and reuse Fibonacci results correctly.
  3. Final Answer:

    const memo = {}; function fib(n) { if (n in memo) return memo[n]; if (n <= 1) return n; memo[n] = fib(n-1) + fib(n-2); return memo[n]; } -> Option B
  4. Quick Check:

    Memoization uses cache object = const memo = {}; function fib(n) { if (n in memo) return memo[n]; if (n <= 1) return n; memo[n] = fib(n-1) + fib(n-2); return memo[n]; } [OK]
Hint: Look for cache object usage to store computed results [OK]
Common Mistakes:
  • Not using a cache to store results
  • Incorrect base case handling
  • Using loops instead of recursion for memoization
3. What will be the output of the following JavaScript code?
function fib(n, memo = {}) {
  if (n <= 1) return n;
  if (memo[n]) return memo[n];
  memo[n] = fib(n - 1, memo) + fib(n - 2, memo);
  return memo[n];
}
console.log(fib(5));
medium
A. 3
B. 8
C. 5
D. Undefined

Solution

  1. Step 1: Trace fib(5) calls with memo

    fib(5) = fib(4) + fib(3), fib(4) = fib(3) + fib(2), fib(3) = fib(2) + fib(1), etc.
  2. Step 2: Calculate Fibonacci values

    fib(0)=0, fib(1)=1, fib(2)=1, fib(3)=2, fib(4)=3, fib(5)=5
  3. Final Answer:

    5 -> Option C
  4. Quick Check:

    fib(5) = 5 [OK]
Hint: Recall Fibonacci sequence: 0,1,1,2,3,5,8... [OK]
Common Mistakes:
  • Confusing fib(5) with fib(6)
  • Ignoring memoization effect
  • Miscounting base cases
4. What will be the output of the following JavaScript code?
function fib(n, memo = {}) {
  if (n <= 1) return n;
  if (memo[n]) return memo[n];
  memo[n] = fib(n - 1, memo) + fib(n - 2, memo);
  return memo[n];
}
console.log(fib(0));
medium
A. 0
B. 1
C. undefined
D. Infinite recursion

Solution

  1. Step 1: Trace fib(0)

    fib(0): n = 0 <= 1, so return 0 immediately. Memo check and recursion not reached.
  2. Step 2: Output

    console.log(0) prints 0.
  3. Final Answer:

    0 -> Option A
  4. Quick Check:

    fib(0) = 0 [OK]
Hint: Base case n <= 1 executes before memo check [OK]
Common Mistakes:
  • Thinking memo[n] check runs for base cases n <= 1
  • Believing falsy memo[0] causes undefined return
  • Forgetting base case includes n = 0
5. You want to find the minimum cost path in a grid from top-left to bottom-right, moving only right or down. Which property allows using dynamic programming to solve this efficiently?
hard
A. Greedy choice: Always pick the cell with the smallest immediate cost.
B. Overlapping subproblems: Each cell's cost is unique and never reused.
C. Divide and conquer: Solve each half of the grid independently.
D. Optimal substructure: The minimum cost path to a cell depends on minimum cost paths to adjacent cells.

Solution

  1. Step 1: Understand minimum cost path problem

    The cost to reach a cell depends on the best path to its neighbors (top or left).
  2. Step 2: Identify optimal substructure

    The problem can be solved by combining optimal solutions of smaller subproblems (cells).
  3. Final Answer:

    Optimal substructure: The minimum cost path to a cell depends on minimum cost paths to adjacent cells. -> Option D
  4. Quick Check:

    Optimal substructure enables DP for grid path [OK]
Hint: Look for problems where solutions build from smaller optimal solutions [OK]
Common Mistakes:
  • Confusing overlapping subproblems with unique subproblems
  • Assuming greedy always works for grid path
  • Ignoring dependency between subproblems
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard