The Fibonacci numbers, commonly denoted F(n) form a sequence, called the Fibonacci sequence, such that each number is the sum of the two preceding ones, starting from 0 and 1. That is,
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), for N > 1.
// Top-Down Dynamic Programming with Memoization
int helper(int N, vector<int>& memo) { // time: O(N); space: O(N)
if (N < 2) return N;
if (memo[N] != -1) return memo[N];
memo[N] = helper(N - 1, memo) + helper(N - 2, memo);
return memo[N];
}
int fib(int N) {
vector<int> memo(N + 1, -1);
return helper(N, memo);
}
// Bottom-Up Dynamic Programming
int fib(int N) { // time: O(n); space: O(n)
if (N == 0) return 0;
vector<int> F(N + 1, 0);
F[1] = 1;
for (int i = 2; i <= N; ++i) {
F[i] = F[i - 2] + F[i - 1];
}
return F.back();
}
// Space Optimized Bottom-Up Dynamic Programming
int fib(int N) { // time: O(n); space: O(1)
if (N == 0) return 0;
int a = 0, b = 1;
for (int i = 2; i <= N; ++i) {
int c = a + b;
a = b;
b = c;
}
return b;
}