개요
- 복잡한 문제를 간단한 여러 개의 문제로 나누어 해결
- 메모이제이션(Memoization)을 이용
- 이전에 계산한 값을 저장해두었다가 사용함으로서 중복 계산 방지
- 최적성의 원리(Principle of optimality를 만족시켜야 함
- 주어진 문제에 대해 최적해가 분할된 부분 문제에 대한 최적해로 구성
방법
예제
- 피보나치 수열
- C++
- 코드
#include <ctime>
#include <iostream>
using namespace std;
long long memoization[100000] = {0, 1};
long long fibonacci(const int& n, const bool isDP = false) {
if (n == 0) {
return 0;
} else if (n == 1) {
return 1;
}
if (isDP && memoization[n] != 0) {
return memoization[n];
}
return memoization[n] = fibonacci(n - 1, isDP) + fibonacci(n - 2, isDP);
}
int main() {
time_t start = time(nullptr);
cout << "result : " << fibonacci(45, true) << ", time : " << time(nullptr) - start
<< "\n";
start = time(nullptr);
cout << "result : " << fibonacci(45) << ", time : " << time(nullptr) - start << "\n";
return 0;
}
- 결과
result : 1134903170, time : 0
result : 1134903170, time : 21