fibo(n)
IF n < 2 : RETURN n
ELSE : RETURN fibo(n-1) + fibo(n-2)
얼마나 중복되었을까?
중복을 어떻게 피할 수 있을까?
컴퓨터 프로그램을 실행할 때, 이전에 계산한 값을 메모리에 저장해서 매번 다시 계산하지 않도록 하여 전체적인 실행속도를 빠르게 하는 기술
동적 계획법의 핵심이 되는 기술
// memo를 위한 배열을 할당하고, 모두 0으로 초기화
// memo[0]을 0으로 memo[1]는 1로 초기화
fibo(n)
IF n>2 AND memo[n] = 0
memo[n] <- fibo(n-1) + fibo(n-2)
RETURN memo[n]

값을 구하지 않았다면 재귀 호출/ 이미 계산 했다면 리턴
내려가면서 접근하므로 하향식 접근방법
추가적인 메모리 공간 필요
재귀 함수 호출로 인한 시스템 호출 스택 사용
동적 계획 (Dynamic Programming) 알고리즘은 그리디 알고리즘과 같이 최적화 문제를 해결하는 알고리즘
최적화 문제 : 최적(최대값이나 최소값) 값을 구하는 문제
동적 계획 알고리즘은 먼저 작은 부분 문제들의 해들을 구하고, 이들을 이용하여 보다 큰 크기의 부분 문제들을 해결하여, 최종적으로 원래 주어진 문제를 해결하는 알고리즘 설계 기법
중복 부분문제 구조 (Overlapping subproblems)
최적 부분문제 구조 (Optimal substructure)
동적 계획법이 최적화에 대한 어느 문제에나 적용되는 것은 아니다.
주어진 문제가 최적화의 원칙 (Principle of Optimality)을 만족해야만 동적 계획법을 효율적으로 적용
최적화의 원칙이란 어떤 문제에 대한 해가 최적일 때, 그 해를 구성하는 작은 문제들의 해 역시 최적이어야 한다는 것
동적 계획법의 방법 자체가 큰 문제의 최적 해를 작은 문제의 최적해들을 이용하여 구하기 때문에 만약 큰 문제의 최적해가 작은 문제들의 최적해들로 구성되지 않는다면 이 문제는 동적 계획법 적용 불가능
최적의 원칙이 적용되지 않는 예시 : 최장경로(Longest Path)
DP에는 부분 문제들 사이 의존적 관계 존재
분할 정복은 하향식 방법
DP는 상향식 방법
문제를 부분 문제로 분할
점화식으로 정의
가장 작은 부분 문제부터 해를 구한다.

fibo_dp(n)
f[0] <- 0
f[1] <- 1
FOR i in 2 -> n
f[i] <- f[i-1] + f[i-2]
RETURN f[n]
작은 문제부터 큰 문제까지 올라가면서 해결
상향식 접근 방법