하위 문제를 계산한 뒤 그 해결책을 저장하고, 나중에 동일한 하위 문제를 만날 경우 저장된 해결책을 적용해 계산 횟수를 줄인다.
→ 하나의 문제는 단 한 번만 풀도록 하는 알고리즘
다음 가정이 만족하는 조건에서 사용할 수 있다.
큰 문제를 작은 문제로 나눌 수 있고, 이 작은 문제가 중복해서 발견된다.
function fib(n) {
if(n <= 2) {
return 1;
};
return fib(n - 1) + fib(n - 2);
}
// 1, 1, 2, 3, 5, 8...
// 재귀함수로 구현한 피보나치 수열
동적 프로그래밍에선 작은 문제들이 반복되고, 이 작은 문제들의 결과값이 항상 같다.
그래서 이를 이용해 한번 계산한 작은 문제를 저장해놓고 재사용한다
작은 문제에서 구한 정답은 그것을 포함하는 큰 문제에서도 같다. 작은 문제에서 구한 정답을 큰 문제에서도 사용할 수 있다.
- Dynamic Programming을 적용하기 위해서는, 작은 문제의 최적 해법을 결합하여 최종 문제의 최적 해법을 구할 수 있어야 한다.
- 작은 문제들이 반복된다
- 같은 문제는 구할때마다 정답이 같다
- DP는 큰 문제를 작은 문제들로 분할하고 이를 이용해 큰 문제를 해결하는 방법이다.
- 분할정복과 다른점은 DP의 경우엔 작은 부분 문제의 답이 늘 같아야 한다는 것이다.