필요한 계산 값을 저장해 두었다가 재사용 하는 알고리즘 설계 기법
다음과 같은 조건을 만족할때 사용 가능
1. 최적 부분 구조 : 큰 문제를 작은 문제로 나눌 수 있다. 이러한 작은 문제의 답을 모아 큰 문제를 해결 가능
def fibo(x):
if x == 1 or x == 2:
return 1
return fibo(x-1) + fibo(x-2)
# 한번 게산된 결과를 메모이제이션하기 위한 리스트
memo = [0]*100
# 피보나치 수열을 재귀함수로 구현(topdown)
def fibo(x):
# fibo(1)=fibo(2)=0
if x==1 or x==2:
return 1
# 이미 계산한 적있는 문제라면 그대로 반환
if memo[x] != 0:
return memo[x]
# 아직 계산하지 않은 문제라면 점화식에 따라서 피보나치 결과 반환
memo[x] = fibo(x-1)+fibo(x-2)
return memo[x]
# 작은 문제부터 해결해서 저장할 dp테이블
dp = [0]*100
# fibo(1)=fibo(2)=0
dp[1]=1
dp[2]=1
n=99
# 피보나치 수열을 반복문으로 구현(bottom up)
for i in range(3, n+1):
dp[i] = dp[i-1]+dp[i-2]
print(dp[n])