큰 문제를 작은 문제로 쪼개서 해결하는 문제
두 가지 조건이 충족할 때 다이나믹 프로그래밍으로 해결 가능
해결 방법
예시
피보나치 수: F0 = 0, F1 = 1, Fn = Fn-1 + Fn-2 (n ≥ 2)
// O(2의n제곱)
int fibonacci(int n) {
if (n <= 1) { return n; }
else { fibonacci(n-1) + fibonacci(n-2) }
}
// 함수의 시간 복잡도 O(1) * N = O(N)
// Top-down 방식의 구현 - 재귀
int memo[100];
int fibonacci(int n) {
if (n <= 1) { return n; }
else {
memo[n] = fibonacci(n-1) + fibonacci(n-2);
return memo[n];
}
}
// Bottom-up 방식의 구현 - for문
int memo[100];
int fibonacci(int n) {
memo[0] = 0;
memo[1] = 1;
for (int i=2; i<=n; i++) {
memo[i] = memo[i-1] + memo[i-2]
}
return memo[n];
}