다이나믹 프로그래밍은 메모리를 적절히 사용해 시간 효율성을 비약적으로 향상시킬 수 있는 방법이다. 동적 계획법이라고도 한다. 이미 계산된 결과를 저장해두어 다시 계산하지 않도록 한다. 일반적으로 Top-down(하향식), Bottom-up(상향식) 두 가지 방식으로 구분된다.
전형적으로 Bottom-up 방식의 활용이 더 많다.
보통 아래와 같은 두 가지 사용조건을 만족할 때 사용한다.
ex) 피보나치 수열
def fibo(n) :
if x == 1 or x == 2 :
return 1
return fibo(n-1)+fibo(n-2)
이 때의 시간복잡도는 O(2N)이 된다.
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))
위의 다이나믹 프로그래밍처럼 메모이제이션(Memoization)을 이용해 구현했을 시, 시간복잡도는 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])