다이나믹 프로그래밍은 복잡한 문제를 작은 [[하위 문제(sub-problems)]]로 나뉘어 해결하고, 그 결과를 저장[[Momoization (메모이제이션)]] 하여 나중에 동일한 하위 문제가 발생했을 때 빠르게 해결하는 알고리즘 설계 기법. 특히, 최적화 문제에 사용됨.
피보나치의 수 : https://www.acmicpc.net/problem/2748
[[하향식 (Top-Down) 접근법]]
def fibonacci(n, memo):
if memo[n] is not None:
return memo[n]
memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo)
return memo[n]
if __name__ == '__main__':
user_input = int(input())
memo = [0, 1] + [None] * (user_input - 1)
print(fibonacci(user_input, memo))
재귀 함수를 호출하고 메모이제이션 하면 하향식
def fibonacci(n):
memo = [0, 1] + [0] * (n - 1) # 메모이제이션을 위한 배열 준비
for i in range(2, n + 1):
memo[i] = memo[i-1] + memo[i-2] # 작은 문제의 해를 이용해 큰 문제 해결
return memo[n]
배열에서 즉시 처리해주는 상향식
상향식과 하향식은 결과를 저장하고 재활용한다는 의미에서 아이디어가 동일하다.