다이나믹 프로그래밍은 메모리를 적절히 사용하여 수행시간 효율성을 비약적으로 향상시키는 방법
이미 계산된 결과(작은 문제)는 별도의 메모리 영역에 저장하여 다시 계산하지 않도록 함
다이나믹 프로그래밍의 구현은 일반적으로 두 가지 방식(탑다운
과 보텀업
)으로 구성된다
하향식
상향식
다이나믹 프로그래밍은 동적 계획법
이라고도 부른다
최적 부분 구조 (Optimal Substructure)
중복되는 부분 문제 (Overlapping Subproblem)
ex) 피보나치 수열
# 피보나치 함수를 재귀함수로 구현
def fibo(x):
if x == 1 or x == 2:
return 1
return fibo(x - 1) + fibo(x - 2)
print(fibo(4))
O(2^n)
를 가지게 된다DP 테이블
이라고 부른다## 탑다운 방식의 피보나치 수열
# 계산된 결과를 메모이제이션 하기 위한 리스트
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))
메모이제이션을 이용하는 경우 피보나치 수열 함수의 시간 복잡도는 O(N)
## 보텀업 방식의 피보나치 수열
d = [0] * 100
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])