What is memoization in the context of dynamic programming?
Memoization is a technique where we store the results of expensive function calls and reuse them when the same inputs occur again, avoiding repeated calculations.
Click to reveal answer
beginner
How does top-down dynamic programming differ from bottom-up?
Top-down DP uses recursion with memoization to solve problems by breaking them into smaller subproblems and storing results. Bottom-up DP solves smaller subproblems first and builds up to the solution iteratively.
Click to reveal answer
beginner
In Go, what data structure is commonly used to implement memoization?
A map (dictionary) is commonly used in Go to store computed results with keys representing input parameters and values as the computed results.
Click to reveal answer
intermediate
Why is memoization important in recursive algorithms?
Memoization prevents repeated calculations of the same subproblems, reducing exponential time complexity to polynomial time, making recursive algorithms efficient.
Click to reveal answer
beginner
What is a common problem solved using top-down DP with memoization?
The Fibonacci sequence is a classic example where top-down DP with memoization efficiently computes values by storing previously calculated Fibonacci numbers.
Click to reveal answer
What does memoization store to optimize recursive calls?
AResults of subproblems
BInput parameters only
CAll function calls regardless of input
DOnly the final result
✗ Incorrect
Memoization stores the results of subproblems to avoid recalculating them.
Which Go data structure is best suited for memoization?
Astruct
Bslice
Carray
Dmap
✗ Incorrect
A map allows storing key-value pairs, perfect for memoization.
Top-down DP with memoization is mainly characterized by:
ANo storage of intermediate results
BIterative loops only
CRecursion with caching
DSorting input data first
✗ Incorrect
Top-down DP uses recursion and caches results to optimize.
What problem does memoization help to avoid in recursion?
ARepeated calculations
BMemory leaks
CInfinite loops
DSyntax errors
✗ Incorrect
Memoization avoids repeated calculations of the same subproblems.
Which of these is a classic example solved by top-down DP with memoization?
ABinary search
BFibonacci sequence
CBubble sort
DLinear search
✗ Incorrect
Fibonacci sequence is a classic example where memoization improves efficiency.
Explain how memoization improves the efficiency of recursive algorithms.
Think about what happens when the same input is processed multiple times.
You got /4 concepts.
Describe the steps to implement top-down dynamic programming with memoization in Go.
Focus on how to combine recursion with caching results.
You got /4 concepts.
Practice
(1/5)
1. What is the main purpose of memoization in top-down dynamic programming?
easy
A. To increase the size of the input for better accuracy
B. To sort the input data before processing
C. To convert recursive code into iterative code
D. To store results of subproblems to avoid repeated calculations
Solution
Step 1: Understand memoization concept
Memoization saves the results of subproblems so they are not recalculated multiple times.
Step 2: Compare options
Only To store results of subproblems to avoid repeated calculations correctly describes this purpose; others describe unrelated actions.
Final Answer:
To store results of subproblems to avoid repeated calculations -> Option D
Quick Check:
Memoization = Store subproblem results [OK]
Hint: Memoization means caching answers to reuse later [OK]
Common Mistakes:
Confusing memoization with sorting
Thinking memoization changes recursion to iteration
Believing memoization increases input size
2. Which of the following Go code snippets correctly initializes a memoization map for storing integer results?
easy
A. memo := []int{}
B. memo := map[string]string{}
C. memo := make(map[int]int)
D. memo := new(int)
Solution
Step 1: Identify correct map initialization
In Go, a map from int to int is created with make(map[int]int).
Step 2: Check other options
memo := []int{} is a slice, not a map; C uses wrong types; D creates a pointer to int, not a map.
Final Answer:
memo := make(map[int]int) -> Option C
Quick Check:
Map[int]int = make(map[int]int) [OK]
Hint: Use make(map[keyType]valueType) to create memo map [OK]
Common Mistakes:
Using slice instead of map for memo
Wrong key or value types in map
Using new(int) which is a pointer, not a map
3. What will be the output of the following Go code using memoization for Fibonacci numbers?
package main
import "fmt"
var memo = make(map[int]int)
func fib(n int) int {
if n <= 1 {
return n
}
if val, ok := memo[n]; ok {
return val
}
memo[n] = fib(n-1) + fib(n-2)
return memo[n]
}
func main() {
fmt.Println(fib(5))
}
4. Identify the bug in this Go memoized Fibonacci function and select the fix:
func fib(n int, memo map[int]int) int {
if n <= 1 {
return n
}
if val, ok := memo[n]; ok {
return val
}
memo[n] = fib(n-1, memo) + fib(n-2, memo)
return memo[n]
}
func main() {
fmt.Println(fib(5, nil))
}
medium
A. Remove memo parameter from fib
B. Initialize memo map before passing to fib
C. Change base case to n < 0
D. Return 0 when n <= 1
Solution
Step 1: Analyze memo usage in fib call
fib is called with memo = nil, so accessing memo[n] causes runtime panic.
Step 2: Fix by initializing memo map before first call
Pass a properly initialized map, e.g., make(map[int]int), to avoid nil map access.
Final Answer:
Initialize memo map before passing to fib -> Option B
Quick Check:
Nil map causes panic; initialize before use [OK]
Hint: Always initialize map before passing to recursive function [OK]
Common Mistakes:
Passing nil map causing runtime panic
Changing base case incorrectly
Removing memo parameter loses memoization
5. Given the following Go code for memoized calculation of the number of ways to climb stairs (1 or 2 steps at a time), what is the output of countWays(4, memo)?
package main
import "fmt"
func countWays(n int, memo map[int]int) int {
if n == 0 {
return 1
}
if n < 0 {
return 0
}
if val, ok := memo[n]; ok {
return val
}
memo[n] = countWays(n-1, memo) + countWays(n-2, memo)
return memo[n]
}
func main() {
memo := make(map[int]int)
fmt.Println(countWays(4, memo))
}
hard
A. 5
B. 7
C. 8
D. Error: infinite recursion
Solution
Step 1: Understand problem and base cases
countWays(0) = 1 (one way to stand still), countWays(n<0) = 0 (no way). Ways to climb n steps = sum of ways for n-1 and n-2.