📖 Scenario: Imagine you want to find the nth number in the Fibonacci sequence. This sequence starts with 0 and 1, and each next number is the sum of the two before it. Calculating this directly can be slow for big numbers.We will use a method called Tabulation Bottom Up Dynamic Programming to find the Fibonacci number quickly by building up from the smallest cases.
🎯 Goal: Build a program that uses a vector to store Fibonacci numbers from the bottom up, then prints the nth Fibonacci number.
📋 What You'll Learn
Create a vector<int> called fib with size n+1
Initialize the first two Fibonacci numbers in fib[0] and fib[1]
Use a for loop with variable i from 2 to n to fill fib[i] as the sum of fib[i-1] and fib[i-2]
Print the value of fib[n]
💡 Why This Matters
🌍 Real World
Calculating Fibonacci numbers quickly is useful in computer graphics, financial models, and algorithm design where repeated calculations happen.
💼 Career
Understanding bottom up dynamic programming is essential for software engineers to optimize recursive problems and improve performance.
Progress0 / 4 steps
1
Create the Fibonacci vector
Create an integer variable n and set it to 10. Then create a vector<int> called fib with size n + 1.
DSA C++
Hint
Use int n = 10; and std::vector fib(n + 1); inside main().
2
Initialize the first two Fibonacci numbers
Set fib[0] to 0 and fib[1] to 1.
DSA C++
Hint
Assign fib[0] = 0; and fib[1] = 1; after creating the vector.
3
Fill the Fibonacci vector using a for loop
Use a for loop with variable i from 2 to n inclusive. Inside the loop, set fib[i] to fib[i - 1] + fib[i - 2].
DSA C++
Hint
Write a for loop starting at 2 up to n. Inside, assign fib[i] as the sum of the two previous Fibonacci numbers.
4
Print the nth Fibonacci number
Print the value of fib[n] using std::cout.
DSA C++
Hint
Use std::cout << fib[n] << std::endl; to print the result.
Practice
(1/5)
1. What is the main idea behind Tabulation Bottom Up DP in dynamic programming?
easy
A. Build a table from the smallest subproblems up to the main problem
B. Solve the problem by recursion without storing results
C. Use random guesses to find the solution
D. Start solving from the largest problem and break it down
Solution
Step 1: Understand bottom-up approach
Tabulation means filling a table starting from the smallest subproblems, so we solve all smaller parts first.
Step 2: Compare with other methods
Unlike recursion without memory, bottom-up avoids repeated work by storing results in a table.
Final Answer:
Build a table from the smallest subproblems up to the main problem -> Option A
Quick Check:
Bottom-up DP = Build table from small to big [OK]
Hint: Think: solve small parts first, then bigger ones [OK]
Common Mistakes:
Confusing bottom-up with recursion without memoization
Thinking it starts from the largest problem
Ignoring the use of a table to store results
2. Which of the following is the correct way to declare a DP table for Fibonacci numbers using tabulation in C++?
easy
A. int dp[]; dp[1] = 1;
B. int dp[100] = {0}; dp[1] = 1;
C. int dp[100]; dp[0] = 1;
D. int dp[100] = {1}; dp[2] = 1;
Solution
Step 1: Check array initialization
int dp[100] = {0}; dp[1] = 1; initializes dp with zeros and sets dp[1] = 1, which is correct for Fibonacci base cases.
Step 2: Identify errors in other options
int dp[]; dp[1] = 1; has no size for dp array, invalid in C++. int dp[100]; dp[0] = 1; sets dp[0] = 1 which is incorrect base case. int dp[100] = {1}; dp[2] = 1; initializes dp with 1 at dp[0], which is wrong.
Final Answer:
int dp[100] = {0}; dp[1] = 1; -> Option B
Quick Check:
Correct base initialization = int dp[100] = {0}; dp[1] = 1; [OK]
Hint: Initialize dp array with zeros and set base cases explicitly [OK]
Common Mistakes:
Not specifying array size
Wrong base case initialization
Assuming default values without initialization
3. What will be the output of the following C++ code using bottom-up DP to find the 5th Fibonacci number?
int fib(int n) {
int dp[6] = {0};
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
int main() {
std::cout << fib(5);
return 0;
}
medium
A. 5
B. 8
C. 3
D. 13
Solution
Step 1: Trace dp array filling
dp[0]=0, dp[1]=1; then dp[2]=1, dp[3]=2, dp[4]=3, dp[5]=5 by adding previous two.
4. Identify the error in this bottom-up DP code for computing factorial of n:
int factorial(int n) {
int dp[100];
dp[0] = 1;
for (int i = 1; i <= n; i++) {
dp[i] = dp[i-1] * i;
}
return dp[n];
}
medium
A. dp array not initialized to zero
B. Loop should start from i = 0
C. dp array size might be too small for large n
D. No error, code is correct
Solution
Step 1: Check dp array size
dp array size is fixed at 100, so if n > 99, dp[i] access is out of bounds causing error.
Step 2: Analyze other parts
Initialization and loop logic are correct; loop starts at 1 and dp[0] = 1 is base case.
Final Answer:
dp array size might be too small for large n -> Option C
Quick Check:
Array size must fit n [OK]
Hint: Ensure dp array size >= n to avoid overflow [OK]
Common Mistakes:
Assuming dp size is always enough
Starting loop at wrong index
Ignoring base case initialization
5. Given the problem to find the minimum number of coins to make amount 11 using coins {1, 3, 5}, which bottom-up DP table entry dp[11] will hold after running this code?
int coins[] = {1, 3, 5};
int n = 11;
int dp[12];
dp[0] = 0;
for (int i = 1; i <= n; i++) {
dp[i] = 1000; // large number
for (int c : coins) {
if (i - c >= 0) {
dp[i] = std::min(dp[i], dp[i-c] + 1);
}
}
}
std::cout << dp[n];
hard
A. 6
B. 5
C. 4
D. 3
Solution
Step 1: Understand DP logic for coin change
dp[i] stores minimum coins for amount i. For 11, check coins 1,3,5 and pick minimum.