동적 계획법(dynamic programming)
예시 - 피보나치 수열
D[N] = D[N-1] + D[N-2] # N번째 수열 = (N-1)번째 수열 + (N-2)번째 수열
동적 계획법으로 풀 수 있는지 확인
점화식 세우기
memoization 원리 이해하기
부분 문제를 풀었을 때 이 문제를 DP 테이블에 저장해 놓고 다음에 같은 문제가 나왔을 때 재계산하지 않고 DP 테이블의 값을 이용하는 것

top-down 구현 방식 이해하기
ex)
import sys
input = sys.stdin.readline
## 입력
N = int(input())
D = [-1] * (N+1)
D[0] = 0
D[1] = 1
## 처리
def fibo(n):
if D[n] != -1: # 기존에 계산한 적이 있는 부분의 문제는 재계산하지 않고 리턴
return D[n]
# memoization: 구한 값을 바로 리턴하지 않고 DP 테이블에서 저장한 후 리턴하도록 로직 구현
D[n] = fibo(n-2) + fibo(n-1)
return D[n]
fibo(N)
## 출력
print(D[N])
bottom-up 구현 방식 이해하기
ex)
import sys
input = sys.stdin.readline
## 입력
N = int(input())
D = [-1] * (N+1)
D[0] = 0
D[1] = 1
## 처리
for i in range(2, N+1):
D[i] = D[i-2] + D[i-1] # 반복문을 이용하여 아래서부터 값을 채워가는 방식
## 출력
print(D[N])