CS/자료 구조 및 알고리즘
[알고리즘 이론] 12. DP (동적 계획법)
by Hoozy
2023. 5. 9.
DP (Dynamic Programming)
- 큰 문제를 작은 문제들로 나누어 푸는 알고리즘이다.
DP의 조건
- 작은 문제의 반복이 일어나는 경우
- 같은 문제는 구할 때마다 정답이 같다.
1. Memoization 을 이용한 피보나치 수열 알고리즘
- 반복하면서 구한 정답은 또 구하지 않게 저장하면서 작은 문제로 나누어 푸는 알고리즘.
public class Fibonacci {
static int[] dp = new int [1000];
static int fibonacci(int n) {
if (n == 0) return 0;
if (n == 1) return 1;
if(dp[n] != 0) return dp[n];
dp[n] = fibonacci(n - 2) + fibonacci(n - 1);
return dp[n];
}
public static void main(String[] args) {
fibonacci(n);
}
}
2. 반복문을 이용한 피보나치 수열 알고리즘
public class Fibonacci {
public static void main(String[] args) {
int[] dp new int[n + 1];
dp[1] = 1;
for(int i = 2; i <= n; i++)
di[i] = dp[i - 1] + dp[i - 1];
int result = dp[n];
}
}
탑다운, 바텀업
- 탑다운 (재귀 호출 사용)
- 가장 먼저 호출하는 문제는 가장 큰 문제 이기 때문에 이런 명칭이 붙음
- 장점은 가독성이 좋고, 본래 점화식을 이해하기 쉽다.
- 바텀업 (반복문 사용)
- 가장 작은 문제들부터 차례차례 답을 쌓아 올려가기 때문에 이런 명칭이 붙음
- 장점은 함수를 별개로 부르지 않아 시간과 메모리를 소량 더 절약할 수 있다는 점이 있다.
알고리즘 문제 추천
- 피보나치 수 2 (브론즈 1)
- 1로 만들기 (실버 3)
- 가장 긴 감소하는 부분 수열 (실버 2)
- LCS 2 (골드 4)
참고 자료
https://velog.io/@sanizzang00/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98Java-Dynamic-Programming%EB%8F%99%EC%A0%81-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D
댓글