큰 문제를 작은 문제로 나눠서 푸는 알고리즘
분할정복은 큰 문제 해결이 어려워, 작은 문제로 나누어 푸는 방법임.
Ex) 피보나치 수열 : 특정 숫자 D[i]를 구하기 위해 , D[i-1] 값과 D[i-2] 값의 합을 구해야함
하나의 문제를 단 한 번만 풀도록 함
1) 큰 문제를 작은 문제로 나눌 수 있다
크고 어려운 문제 → 작게 나누어 해결 → 전체의 답
분할정복과 다르게, '메모이제이션(Memoization)' 이 사용됨
→ 이미 계산한 결과는 배열에 저장
2) 작은 문제가 반복될 때 : 같은 문제는 구할 때 마다 결과가 같다
#include <iostream>
using namespace std;
int fib(int n) {
if(n == 1) return 1;
if(n == 2) return 1;
return d(n - 1) + d(n - 2);
}
int main() {
cout<<fib(10);
return 0;
}
#include <iostream>
using namespace std;
int arr[100]; // 계산한 숫자 저장, 전역변수는 항상 0으로 초기화 되어있음
int fib(int n) {
if(n == 1) return 1;
if(n == 2) return 1;
if(arr[n] != 0) return d[n]; // 이미 계산한 적이 있다면
return arr[n] = fib(n - 1) + fib(n - 2);
}