동적 계획법 : 어떤 문제를 여러 개의 작은 문제로 나눠 해결하고 그 결과를 저장 했다가 큰 문제를 풀 때 사용하는 문제 풀이 기법
1. 최적 부분 구조
2. 겹치는 부분 문제
피보나치 수열 점화식
이걸 재귀함수로 구현하면, 다음과 같다.
def fibo(n):
if n==1 or n==2:
return 1
return fibo(n-1) + fibo(n-2)
메모이제이션 : 한 번 구한 계산 결과를 메모리 공간에 메모해두고, 같은 식을 다시 호출하면 메모한 결과를 그대로 가져오는 기법
# DP
# memoization (하향식)
dp = [0]*100 # 소문제 결과를 저장할 리스트
dp[0] = 1
dp[1] = 1
def fib(n):
# 만약 계산한 적이 없다면 재귀로 계산
if dp[n] == 0:
dp[n] = fib(n-1) + fib(n-2)
# 있다면 그대로 반환
return dp[n]
fib(10)
# DP
# 타뷸레이션 (상향식)
def fib(n):
dp = [0]*(n+1)
dp[0] = 1
dp[1] = 1
# 작은 값(소문제)부터 직접 계산하며 진행
for i in range(2,n+1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]
fib(10)
https://c4u-rdav.tistory.com/37
https://doing7.tistory.com/75
https://lsh424.tistory.com/76