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 solves the problem by breaking it into subproblems recursively and uses memoization to save results. Bottom-up solves smaller subproblems first and builds up to the solution.
Click to reveal answer
intermediate
In Rust, which data structure is commonly used to store memoized results for top-down DP?
A Vec or a HashMap is commonly used to store memoized results, where Option indicates if a result is computed or not.
Click to reveal answer
beginner
Why is memoization important in recursive solutions?
Memoization prevents repeated work by caching results of subproblems, which reduces exponential time complexity to polynomial time in many cases.
Click to reveal answer
beginner
What is a key step to implement memoization in a top-down DP function?
Before computing a subproblem, check if its result is already stored in the memo. If yes, return it immediately; if no, compute and store it.
Click to reveal answer
What does memoization primarily help to avoid in recursive algorithms?
ARepeated calculations of the same subproblems
BUsing too much memory
CWriting iterative loops
DSorting data before processing
✗ Incorrect
Memoization stores results of subproblems to avoid recalculating them multiple times.
Which Rust type is best suited to represent a memo table that may or may not have computed values?
AString
BVec<T>
CVec<Option<T>>
DHashSet<T>
✗ Incorrect
Vec
In top-down DP, when do you store a computed result in the memo?
AOnly at the end of the program
BAfter computing the subproblem result
CBefore computing the subproblem
DNever, memo is read-only
✗ Incorrect
You store the result after computing it to reuse later.
What is the main difference between top-down and bottom-up DP?
ATop-down uses recursion with memoization; bottom-up uses iteration
BTop-down is slower than bottom-up
CBottom-up uses recursion; top-down uses loops
DThey are the same
✗ Incorrect
Top-down solves problems recursively with memoization; bottom-up builds solutions iteratively.
Which problem is a classic example to apply memoization top-down DP?
APrinting a string
BSorting an array
CBinary search
DFibonacci sequence calculation
✗ Incorrect
Fibonacci calculation has overlapping subproblems and benefits from memoization.
Explain how memoization works in a top-down dynamic programming approach.
Think about how you remember answers to smaller questions to avoid re-solving them.
You got /4 concepts.
Describe how you would implement memoization in Rust for a recursive function.
Consider how Rust handles optional values and indexing.
You got /4 concepts.
Practice
(1/5)
1. What is the main purpose of memoization in top-down dynamic programming?
easy
A. To store results of subproblems to avoid repeated calculations
B. To sort the input data before processing
C. To convert recursive code into iterative code
D. To reduce memory usage by deleting variables
Solution
Step 1: Understand memoization role
Memoization saves results of subproblems so they are not recalculated multiple times.
Step 2: Compare options
Only To store results of subproblems to avoid repeated calculations describes this purpose correctly. Sorting, converting recursion, or deleting variables are unrelated.
Final Answer:
To store results of subproblems to avoid repeated calculations -> Option A
Quick Check:
Memoization = store subproblem results [OK]
Hint: Memoization means saving answers to reuse later [OK]
Common Mistakes:
Confusing memoization with sorting
Thinking memoization reduces memory by deleting data
Believing memoization changes recursion to iteration
2. Which of the following Rust code snippets correctly declares a memoization cache for a function with input type usize and output type usize?
easy
A. let memo: Vec<usize> = Vec::new();
B. let memo = HashMap::new();
C. let mut memo: Vec = vec![None; n + 1];
D. let mut memo: Vec<usize> = vec![0; n];
Solution
Step 1: Identify correct memo type
Memoization cache should store Option<usize> to mark computed or not, initialized with None.
Step 2: Check each option
let mut memo: Vec = vec![None; n + 1]; uses Vec with None values, correct for memoization. let memo = HashMap::new(); is a HashMap but missing mut and initialization syntax. let memo: Vec<usize> = Vec::new(); lacks Option type. let mut memo: Vec<usize> = vec![0; n]; uses usize with zeros, which can't distinguish computed or not.
Final Answer:
let mut memo: Vec = vec![None; n + 1]; -> Option C
Quick Check:
Memo cache = Vec with None [OK]
Hint: Use Option type to mark uncomputed states [OK]
Common Mistakes:
Using Vec<usize> without Option to track computed
Not making memo mutable
Incorrect initialization of HashMap
3. Consider this Rust function using memoization to compute Fibonacci numbers:
fn fib(n: usize, memo: &mut Vec) -> usize {
if n <= 1 {
return n;
}
if let Some(val) = memo[n] {
return val;
}
let result = fib(n - 1, memo) + fib(n - 2, memo);
memo[n] = Some(result);
result
}
fn main() {
let n = 5;
let mut memo = vec![None; n + 1];
println!("{}", fib(n, &mut memo));
}
4. This Rust code tries to memoize the factorial function but has a bug:
fn fact(n: usize, memo: &mut Vec) -> usize {
if n == 0 {
return 1;
}
if memo[n].is_some() {
return memo[n].unwrap();
}
let result = n * fact(n - 1, memo);
memo[n] = Some(result);
result
}
fn main() {
let n = 5;
let mut memo = vec![None; n];
println!("{}", fact(n, &mut memo));
}
What is the bug causing a runtime error?
medium
A. The memo vector size is too small causing index out of bounds
B. The base case should return 0 instead of 1
C. The function does not update memo correctly
D. The function should not use recursion
Solution
Step 1: Check memo vector size
Memo is created with size n (5), but fact accesses memo[n], which is memo[5], out of bounds since indices go 0 to 4.
Step 2: Identify cause of runtime error
Accessing memo[5] causes panic due to index out of bounds. The vector should be size n+1 to include index 5.
Final Answer:
The memo vector size is too small causing index out of bounds -> Option A
Quick Check:
Vector size < needed index = runtime error [OK]
Hint: Memo size must cover all indices used [OK]
Common Mistakes:
Ignoring vector size when indexing
Changing base case incorrectly
Thinking recursion is the problem
5. You want to use top-down memoization in Rust to count the number of ways to climb a staircase of n steps, taking 1 or 2 steps at a time. Which of these implementations correctly applies memoization to avoid repeated calculations?
fn climb(n: usize, memo: &mut Vec) -> usize {
if n == 0 {
return 1;
}
if n < 0 {
return 0;
}
if let Some(val) = memo[n] {
return val;
}
let ways = climb(n - 1, memo) + climb(n - 2, memo);
memo[n] = Some(ways);
ways
}
fn main() {
let n = 4;
let mut memo = vec![None; n + 1];
println!("{}", climb(n, &mut memo));
}
hard
A. Incorrect because it does not handle negative indices safely
B. Incorrect because it uses iteration instead of recursion
C. Incorrect because memo vector is not mutable
D. Correct implementation with proper base cases and memo usage
Solution
Step 1: Check base cases and recursion
Base cases handle n == 0 (1 way) and n < 0 (0 ways), which is correct for counting ways.
Step 2: Verify memoization usage
Memo vector is mutable and stores Option<usize>. It checks memo[n] before recursion and stores result after calculation.
Step 3: Confirm no unsafe indexing
Negative n returns 0 before indexing memo, so no out-of-bounds access.
Final Answer:
Correct implementation with proper base cases and memo usage -> Option D
Quick Check:
Base cases + memo check = correct memoization [OK]
Hint: Check base cases and memo before recursion [OK]
Common Mistakes:
Not handling negative n before memo access
Forgetting to make memo mutable
Using iteration instead of recursion in top-down DP
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.