Bird
Raised Fist0
DSA C#programming~20 mins

Overlapping Subproblems and Optimal Substructure in DSA C# - Practice Problems & Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Master of Overlapping Subproblems and Optimal Substructure
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of Fibonacci with Memoization
What is the output of the following C# code that calculates Fibonacci numbers using memoization?
DSA C#
using System;
using System.Collections.Generic;

class Program {
    static Dictionary<int, int> memo = new Dictionary<int, int>();

    static int Fib(int n) {
        if (n <= 1) return n;
        if (memo.ContainsKey(n)) return memo[n];
        int result = Fib(n - 1) + Fib(n - 2);
        memo[n] = result;
        return result;
    }

    static void Main() {
        Console.WriteLine(Fib(6));
    }
}
A21
B5
C13
D8
Attempts:
2 left
💡 Hint
Recall that Fibonacci sequence starts with 0, 1, 1, 2, 3, 5, 8, 13...
🧠 Conceptual
intermediate
1:30remaining
Identifying Optimal Substructure
Which of the following problems exhibits optimal substructure, meaning the optimal solution can be constructed from optimal solutions of its subproblems?
AFinding the shortest path in a graph using Dijkstra's algorithm
BSorting an array using bubble sort
CChecking if a number is prime
DPrinting all permutations of a string
Attempts:
2 left
💡 Hint
Optimal substructure means the problem can be broken down into smaller problems whose solutions combine to solve the bigger problem optimally.
🔧 Debug
advanced
2:30remaining
Debugging Memoization in Recursive Solution
The following C# code attempts to compute the minimum cost path in a grid using memoization but produces incorrect results. What is the main bug?
DSA C#
using System;
using System.Collections.Generic;

class Program {
    static int[,] grid = { {1, 3, 5}, {2, 1, 2}, {4, 3, 1} };
    static Dictionary<(int,int), int> memo = new Dictionary<(int,int), int>();

    static int MinCost(int r, int c) {
        if (r == 0 && c == 0) return grid[0,0];
        if (r < 0 || c < 0) return int.MaxValue;
        if (memo.ContainsKey((r,c))) return memo[(r,c)];

        int up = MinCost(r - 1, c);
        int left = MinCost(r, c - 1);
        int result = grid[r,c] + Math.Min(up, left);
        // Missing memoization store here
        return result;
    }

    static void Main() {
        Console.WriteLine(MinCost(2, 2));
    }
}
AThe memo dictionary is never updated with computed results.
BThe base case for (0,0) is incorrect and should return 0.
CThe grid indices are accessed out of bounds causing runtime error.
DThe recursive calls do not handle negative indices properly.
Attempts:
2 left
💡 Hint
Check if the memo dictionary is used to store results after computation.
❓ Predict Output
advanced
2:00remaining
Output of Longest Common Subsequence Length
What is the output of the following C# code that computes the length of the longest common subsequence (LCS) between two strings using recursion with memoization?
DSA C#
using System;
using System.Collections.Generic;

class Program {
    static Dictionary<(int,int), int> memo = new Dictionary<(int,int), int>();

    static int LCS(string s1, string s2, int i, int j) {
        if (i == s1.Length || j == s2.Length) return 0;
        if (memo.ContainsKey((i,j))) return memo[(i,j)];

        if (s1[i] == s2[j]) {
            memo[(i,j)] = 1 + LCS(s1, s2, i + 1, j + 1);
        } else {
            memo[(i,j)] = Math.Max(LCS(s1, s2, i + 1, j), LCS(s1, s2, i, j + 1));
        }
        return memo[(i,j)];
    }

    static void Main() {
        Console.WriteLine(LCS("AGGTAB", "GXTXAYB", 0, 0));
    }
}
A6
B5
C4
D7
Attempts:
2 left
💡 Hint
The longest common subsequence between "AGGTAB" and "GXTXAYB" is "GTAB" (length 4).
🧠 Conceptual
expert
1:30remaining
Recognizing Overlapping Subproblems in Algorithms
Which of the following algorithms does NOT exhibit overlapping subproblems, meaning it does not solve the same subproblems multiple times?
AComputing Fibonacci numbers using naive recursion
BMerge sort algorithm
CCalculating binomial coefficients using Pascal's triangle with memoization
DSolving the knapsack problem using dynamic programming
Attempts:
2 left
💡 Hint
Overlapping subproblems means the algorithm solves the same smaller problem multiple times.

Practice

(1/5)
1. Which of the following best describes the concept of Overlapping Subproblems in dynamic programming?
easy
A. The problem has a unique solution that can be found without recursion.
B. The problem can be broken down into smaller subproblems which are solved multiple times.
C. The problem requires sorting before solving.
D. The problem can only be solved using greedy algorithms.

Solution

  1. Step 1: Understand Overlapping Subproblems

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

    The problem can be broken down into smaller subproblems which are solved multiple times. correctly states that subproblems are solved multiple times, which is the key idea behind overlapping subproblems.
  3. Final Answer:

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

    Overlapping Subproblems = The problem can be broken down into smaller subproblems which are solved multiple times. [OK]
Hint: Look for repeated smaller problems solved multiple times [OK]
Common Mistakes:
  • Confusing overlapping subproblems with unique subproblems
  • Thinking greedy algorithms always apply
  • Ignoring recursion or repeated calculations
2. Which of the following C# method signatures correctly represents a memoized Fibonacci function using recursion?
easy
A. string Fib(int n, Dictionary memo)
B. void Fib(int n)
C. int Fib(int n, int[] memo)
D. int Fib(int n, Dictionary memo)

Solution

  1. Step 1: Identify correct return type and parameters

    The Fibonacci function returns an integer and uses a dictionary to store computed values for memoization.
  2. Step 2: Check options for matching signature

    int Fib(int n, Dictionary memo) returns int and takes an int and a Dictionary for memo, which is correct for memoized recursion.
  3. Final Answer:

    int Fib(int n, Dictionary memo) -> Option D
  4. Quick Check:

    Memoized Fib signature = int Fib(int n, Dictionary memo) [OK]
Hint: Memoized functions usually take a cache parameter like Dictionary [OK]
Common Mistakes:
  • Using void return type instead of int
  • Using wrong data structure for memo
  • Returning string instead of int
3. What is the output of the following C# code?
static int Fib(int n, int[] memo) {
  if (n <= 1) return n;
  if (memo[n] != 0) return memo[n];
  memo[n] = Fib(n - 1, memo) + Fib(n - 2, memo);
  return memo[n];
}

static void Main() {
  int n = 5;
  int[] memo = new int[n + 1];
  Console.WriteLine(Fib(n, memo));
}
medium
A. 5
B. 8
C. 3
D. 0

Solution

  1. Step 1: Understand Fibonacci calculation for n=5

    Fibonacci sequence: 0,1,1,2,3,5,... So Fib(5) = 5.
  2. Step 2: Trace memoized calls

    Memo array caches results to avoid repeated calls, final result printed is Fib(5) = 5.
  3. Final Answer:

    5 -> Option A
  4. Quick Check:

    Fib(5) = 5 [OK]
Hint: Recall Fibonacci sequence values for small n [OK]
Common Mistakes:
  • Confusing Fib(5) with Fib(6)
  • Ignoring memoization effect
  • Assuming zero-based indexing for output
4. Identify the error in the following C# code implementing a memoized Fibonacci function:
static int Fib(int n, int[] memo) {
  if (n <= 1) return n;
  if (memo[n] != -1) return memo[n];
  memo[n] = Fib(n - 1, memo) + Fib(n - 2, memo);
  return memo[n];
}

static void Main() {
  int n = 4;
  int[] memo = new int[n + 1];
  Console.WriteLine(Fib(n, memo));
}
medium
A. The memo array is not initialized with -1, so memo[n] != -1 check fails.
B. The base case should return 0 instead of n.
C. The function should return void instead of int.
D. The memo array size is too large.

Solution

  1. Step 1: Check memo array initialization

    The memo array is created but not initialized to -1, so all values default to 0.
  2. Step 2: Analyze memo[n] != -1 condition

    Since memo[n] starts at 0, the condition memo[n] != -1 is always true for n>0, causing incorrect memo hits.
  3. Final Answer:

    The memo array is not initialized with -1, so memo[n] != -1 check fails. -> Option A
  4. Quick Check:

    Uninitialized memo array causes wrong memo check [OK]
Hint: Initialize memo with sentinel values matching your check [OK]
Common Mistakes:
  • Not initializing memo array properly
  • Incorrect base case return values
  • Wrong return type for recursive function
5. You want to find the minimum cost path in a grid from top-left to bottom-right, moving only right or down. The cost grid is:
int[,] cost = {
  {1, 3, 5, 8},
  {4, 2, 1, 7},
  {4, 3, 2, 3}
};

Which approach best uses Overlapping Subproblems and Optimal Substructure to solve this efficiently?
hard
A. Calculate all paths and pick the minimum cost path at the end.
B. Use a greedy approach picking the minimum cost neighbor at each step.
C. Use recursion with memoization to store minimum cost for each cell.
D. Use a stack to store all possible paths and backtrack.

Solution

  1. Step 1: Understand problem structure

    The minimum cost path problem has overlapping subproblems because many paths share subpaths, and optimal substructure because the best path to a cell depends on best paths to neighbors.
  2. Step 2: Choose efficient approach

    Recursion with memoization stores results of subproblems to avoid recomputation, efficiently solving the problem.
  3. Final Answer:

    Use recursion with memoization to store minimum cost for each cell. -> Option C
  4. Quick Check:

    Memoized recursion fits overlapping subproblems and optimal substructure [OK]
Hint: Memoize subproblem results to avoid repeated calculations [OK]
Common Mistakes:
  • Using greedy approach which may fail for this problem
  • Trying all paths causing exponential time
  • Using stack/backtracking without memoization
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