이미 계산된 결과를 별도의 메모리 영역에 저장하여 다시 계산하지 않도록 함
→ 수행 시간 효율성 비약적 향상
최적 부분 구조
: 큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결할 수 있을 때
중복되는 부분 문제
: 동일한 작은 문제를 반복적으로 해결해야 할 때
점화식을 구하고 다음 방법 중 택 1
피보나치 수열
1 1 2 3 5 8 13 21 34 55 89
an = an-1 + an-2 (a1 = 1, a2 = 1)
: f(2)가 여러 번 호출 됨 (중복되는 부분 문제)
시간복잡도 : O(2N)
def fibo(n):
if n == 1 or n == 2:
return 1
return fibo(n-1) + fibo(n-2)
print(fibo(6)) # 8
시간복잡도 : O(N)
d = [0] * 100
def fibo(n):
if n == 1 or n == 2:
return 1
if d[n] != 0:
return d[n]
d[n] = fibo(n-1) + fibo(n-2)
return d[n]
print(fibo(99)) # 218922995834555169026
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]) # 218922995834555169026
공통점: 최적 부분 구조를 가짐 (큰 문제를 작은 문제로 나누고, 작은 문제들의 답을 모아 큰 문제 해결)
차이점: 부분 문제의 중복