복잡한 문제를 작은 하위 문제로 나누어 푸는 알고리즘 기법
다른 알고리즘과의 차이점
- 분할 정복
- 분할 정복은 부분 문제가 중복되지 않음
- DP는 부분 문제가 중복되어 재활용에 사용
- 그리디 알고리즘
- 그리디 알고리즘은 순간의 최선을 구하는 방식(근사치)
- DP는 모든 방법을 확인 후 최적해를 구하는 방식
// 시간 복잡도 - O(n)
public class FibonacciDP {
static int fib(int n) {
if (n <= 1) return n;
int[] dp = new int[n + 1];
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
public static void main(String[] args) {
System.out.println(fib(10)); // 55
}
}
// 시간 복잡도 - O(n)
public class FibonacciMemo {
static int fib(int n) {
int[] memo = new int[n+1];
if (n <= 2) return 1;
if (memo[n]!=0) return memo[n];
memo[n] = fib(n - 1) + fib(n - 2);
return memo[n];
}
public static void main(String[] args) {
System.out.println(fib(10)); // 55
}
}