💡 메모이제이션 : 다이나믹 프로그래밍을 구현하는 방법 중 하나 한 번 계산한 결과를 메모리 공간에 메모 -> 같은 문제를 다시 호출하면 메모했던 결과를 그대로 가져옴
최적 부분 구조
: 큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결
중복되는 부분 문제
: 동일한 작은 문제를 반복적으로 해결
1. 탑다운 다이나믹 프로그래밍 소스코드
# 한 번 계산된 결과를 메모이제이션하기 위한 리스트 초기화
d = [0] *100
# 피보나치 함수를 재귀함수로 구현(탑다운 다이나믹 프로그래밍)
def fibo(x):
if x==1 or x==2:
return 1
# 이미 계산한 적 있는 문제라면 그대로 반환
if d[x] != 0:
return d[x]
# 아직 계산하지 않은 문제라면 점화식에 따라서 피보나치 결과 반환
d[x] = fibo(x-1)+fibo(x-2)
return d[x]
print(fibo(99))
2. 보텀업 다이나믹 프로그래밍 소스코드
# 앞서 계산된 결과를 저장하기 위한 DP 테이블 초기화
d = [0] * 100
# 첫번째 피보나치 수와 두번쨰 피보나치 수는 1
d[1] =1
d[2] =1
n = 99
# 피보나치 함수 반복문으로 구현
for i in range(3, n+1):
d[i] = d[i-1]+d[i-2]
print(d[n])