Introduction
- It is an optimization over plain recursion
- The idea is to reuse the solution of subproblem when they are overlapping
- 2 ways to implement:
- Memoization (Top Down)
- Tabulation (Bottom Up)
Applications: Bellman Ford Algo, Floyd Warshall Algo
Pseudo Code:
def fibonacci(n):
if n == 0 or n == 1:
return n
return fibonacci(n-1) + fibonacci(n - 2)
Suppose we call fibonacci(5)
At line 4: fibonacci(4) + fibonacci(3)
fibonacci(4) will again call for fibonacci(3)
Hence we will have to calculate fibonacci(3) twice
Memoization
- Python
dp = [None] * 100
def fibonacci(n):
if dp[n] != None:
return dp[n]
if n == 0 or n == 1:
dp[n] = n
else:
dp[n] = fibonacci(n - 1) + fibonacci(n - 2)
return dp[n]
Tabulation
- Python
def fibonacci(n):
dp = [None] * (n + 1)
dp[0] = 0
dp[1] = 1
for i in range(2, n + 1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]