Bird
Raised Fist0
DSA Cprogramming~5 mins

Overlapping Subproblems and Optimal Substructure in DSA C - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What does the term Overlapping Subproblems mean in dynamic programming?
It means the problem can be broken down into smaller subproblems which are solved multiple times. Instead of solving them repeatedly, we store their results to save time.
Click to reveal answer
beginner
Define Optimal Substructure in simple words.
A problem has optimal substructure if the best solution to the problem can be made by combining the best solutions to its smaller parts.
Click to reveal answer
intermediate
Why is Overlapping Subproblems important for dynamic programming?
Because it allows us to reuse solutions of subproblems instead of recalculating them, which makes the program faster and more efficient.
Click to reveal answer
intermediate
Give an example of a problem that shows both Overlapping Subproblems and Optimal Substructure.
The Fibonacci sequence problem: calculating Fibonacci numbers involves solving the same smaller Fibonacci problems repeatedly (overlapping subproblems), and the best solution for a number depends on the best solutions of the two previous numbers (optimal substructure).
Click to reveal answer
intermediate
How does Optimal Substructure help in designing algorithms?
It helps by allowing us to build the solution step-by-step from smaller solutions, ensuring that solving smaller parts optimally leads to the overall best solution.
Click to reveal answer
Which of the following best describes Overlapping Subproblems?
ASubproblems are independent and solved once
BSubproblems are unrelated to the main problem
CSubproblems are always larger than the main problem
DSubproblems repeat and are solved multiple times
What does Optimal Substructure imply about a problem?
AThe best solution depends on the best solutions of smaller parts
BThe problem requires random guessing
CThe problem has no solution
DThe problem cannot be divided into smaller parts
Which problem is a classic example of overlapping subproblems?
AFinding maximum in an array
BSorting an array
CCalculating Fibonacci numbers
DBinary search
Why do dynamic programming algorithms store results of subproblems?
ATo avoid recalculating the same subproblems
BTo use more memory
CTo make the code longer
DTo confuse the programmer
If a problem does NOT have optimal substructure, can dynamic programming be used effectively?
AYes, always
BNo, because solutions to subproblems don't build the overall solution
CYes, but only with recursion
DNo, because the problem is unsolvable
Explain in your own words what overlapping subproblems and optimal substructure mean and why they are important in dynamic programming.
Think about how breaking a problem into parts helps solve it faster.
You got /4 concepts.
    Describe a real-life example or simple problem that shows both overlapping subproblems and optimal substructure.
    Try to think of a problem where you solve the same small part many times.
    You got /3 concepts.

      Practice

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

      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 C
      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 overlapping subproblems
      • Assuming recursion alone solves overlapping subproblems
      2. Which of the following is the correct syntax to declare a memoization array for storing results of subproblems in C?
      easy
      A. int memo[] = 0;
      B. int memo = new int[1000];
      C. int memo(1000);
      D. int memo[1000] = {0};

      Solution

      1. Step 1: Understand C array declaration

        In C, arrays are declared with fixed size and can be initialized with {0} to set all elements to zero.
      2. Step 2: Check options for valid C syntax

        int memo[1000] = {0}; uses correct C syntax: int memo[1000] = {0}; initializes an array of 1000 integers to zero.
      3. Final Answer:

        int memo[1000] = {0}; -> Option D
      4. Quick Check:

        C array declaration with initialization = int memo[1000] = {0}; [OK]
      Hint: Use fixed size array with braces to initialize in C [OK]
      Common Mistakes:
      • Using C++ style vector or new keyword in C
      • Declaring arrays without size
      • Incorrect initialization syntax
      3. Consider the following C code for Fibonacci with memoization:
      int memo[100] = {0};
      
      int fib(int n) {
          if (n <= 1) return n;
          if (memo[n] != 0) return memo[n];
          memo[n] = fib(n-1) + fib(n-2);
          return memo[n];
      }
      
      int main() {
          printf("%d", fib(5));
          return 0;
      }
      What is the output when this code runs?
      medium
      A. 0
      B. 5
      C. 3
      D. 8

      Solution

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

        fib(5) calls fib(4) + fib(3). fib(4) calls fib(3) + fib(2), and so on. Base cases fib(0)=0, fib(1)=1.
      2. Step 2: Calculate fib(5)

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

        5 -> Option B
      4. Quick Check:

        Fibonacci(5) = 5 [OK]
      Hint: Recall Fibonacci sequence: 0,1,1,2,3,5... [OK]
      Common Mistakes:
      • Confusing index with Fibonacci value
      • Ignoring memoization effect
      • Miscomputing base cases
      4. The following code attempts to compute the nth Fibonacci number using memoization but has a bug:
      int memo[100] = {0};
      
      int fib(int n) {
          if (n == 0) return 0;
          if (n == 1) return 1;
          if (memo[n] != 0) return memo[n];
          memo[n] = fib(n-1) + fib(n-2);
          return memo[n];
      }
      
      int main() {
          printf("%d", fib(0));
          return 0;
      }
      What is the bug in this code?
      medium
      A. fib(0) returns 0 but memo[0] is never set, causing repeated calls.
      B. The memo array is not initialized to zero.
      C. The base case for fib(1) is missing.
      D. The memoization check uses wrong index.

      Solution

      1. Step 1: Analyze base cases and memo usage

        fib(0) returns 0 but does not store it in memo[0]. So memo[0] remains 0, which is the default value.
      2. Step 2: Understand effect on memoization

        Because the base case results are not stored in memo[n], fib(0) (and fib(1)) will be called repeatedly in the recursion tree for larger n, instead of returning a cached value.
      3. Final Answer:

        fib(0) returns 0 but memo[0] is never set, causing repeated calls. -> Option A
      4. Quick Check:

        Base case not stored in memo causes repeated calls [OK]
      Hint: Store base case results in memo to avoid repeated calls [OK]
      Common Mistakes:
      • Assuming memo array auto-initializes for base cases
      • Missing base case for fib(1)
      • Incorrect memo check condition
      5. You want to find the minimum cost to reach the top of stairs where each step has a cost. You can climb 1 or 2 steps at a time. The cost array is cost[] = {10, 15, 20}. Using dynamic programming with overlapping subproblems and optimal substructure, what is the minimum cost to reach the top (beyond last step)?
      hard
      A. 15
      B. 20
      C. 25
      D. 10

      Solution

      1. Step 1: Define subproblems and recurrence

        Minimum cost to reach step i: dp[i] = cost[i] + min(dp[i-1], dp[i-2]). dp[0]=10, dp[1]=15.
      2. Step 2: Calculate minimum cost step by step

        dp[2] = 20 + min(10,15) = 30. To reach top (beyond last step), min(dp[1], dp[2]) = min(15,30) = 15.
      3. Final Answer:

        15 -> Option A
      4. Quick Check:

        Minimum cost to top = 15 [OK]
      Hint: Use min cost of last two steps for final answer [OK]
      Common Mistakes:
      • Adding all costs instead of choosing min path
      • Ignoring that you can start from step 0 or 1
      • Confusing cost to step vs cost beyond last step
      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