가장 작은 부분의 해답을 구한 후 이를 저장하여, 저장한 값을 이용해 상위 문제를 풀어가는 방식
동적 계획법을 적용하기 위해서는 두 가지 속성을 만족시켜야 한다.
- 부분 반복 문제 (Overlapping Subproblem)
func fibo(_ n: Int) -> {
if n <= 1 { return n }
return fibo(n - 1) + fibo (n - 2)
}
만약 fibo(7) 을 구하는 과정을 도식화 해보면, 아래 이진 트리와 같다.
이때 부분문제 (subproblem) 란 항상 새로운 부분 문제를 생성해내기 보다는 계속해서 같은 부분 문제가 여러번 재사용되거나 재귀 알고리즘을 통해 해결되는 문제를 가르킨다.
- 최적 부분 구조 (Optimal Substructure)
동일한 계산을 반복해야할 때, 이전에 계산한 값을 메모리에 저장하여 반복 수행을 제거하여 프로그램 실행 속도를 빠르게 함
하향식 접근 방법
숫자의 범위가 크고, 경우의 수가 엄청 많은 문제들
이 대부분 DP(동적계획법) 을 활용하여 풀어야 하는 문제이다.O(N)
한번의 반복문을 사용하기 때문에 시간복잡도는 O(N)
이다. 또한 각 항의 값을 기억하고 있어야 하니까 O(N)의 메모리가 필요하기 때문에 공간복잡도 또한 O(N)이다.
func fibo(_ n: Int) -> Int {
var cache: [Int] = [0, 1]
for num in 2...n {
cache.append(cache[num - 1] + cache[num - 2])
}
return cache[n]
}
fibo(4)