728x90
반응형
optimization problen
- 문제를 해결하는 최적의 답
- maximum, minimum을 구하는 문제
=> 가장 빨리 도착하는 경로의 소요 시간?, 주식을 사고 팔 때 가장 높은 수익?
다이나믹 프로그래밍
- 큰 문제를 작은 문제로 나눠서 푸는 방법
- 큰 문제를 작은 문제를 여러 번 재사용한다는 특징을 이용함
- 이전의 작은 문제의 값을 기억하고 같은 문제가 나오면 저장해둔 결과를 가져옴
다이나믹 프로그래밍 2가지 조건
- 최적 부분 구조(Optimal Substructure): 작은 문제들의 해결 방법을 합치면 큰 문제
- 단, subproblems이 독립적이어야 함
- 중복되는 부분(Overlapping Subproblems): 문제를 작은 문제로 나누었을 때, 동일한 문제가 반복적으로 발생하는 경우
다이나믹 프로그래밍 2가지 방식
| Top-Down Approach | Bottom-Up Approach | |
| 구조 | recursive | iterative |
| 결과 저장 | memoization | tabulation |
| 사용 시기 | subproblems의 일부분으로 최적해를 구할 수 있을 때 | 모든 결과를 계산해야 최적해를 구할 수 있을 때 |
- Top-Down Approach
- 큰 문제를작은 문제로 나눔 (분할 정복)
- 재괴 함수를 이용하여 구현
- Memoization을 사용하여 결과 저장
- Bottom-Up Approach
- 작은 문제부터 큰 문제를 해결
- 동적 계획법(Dynamic Programming)
다이나믹 프로그래밍 예시
- recursive
public class Main {
public static int fibonacci(int n) {
if(n <= 1) {
return n;
} else {
return fibonacci(n - 1) + fibonacci(n - 2);
}
}
public static void main(String[] args) {
System.out.println(fibonacci(10)); // 10번째 피보나치 수 출력
}
}
2. Top-Down Approach
public class Main {
public static Integer[] dp = new Integer[31]; // 메모이제이션을 위한 배열
public static int fibonacci(int n) {
if(n <= 1) {
return dp[n] = n;
}
if(dp[n] != null) { // 이미 계산한 적 있는 문제라면 저장된 값 반환
return dp[n];
}
return dp[n] = fibonacci(n - 1) + fibonacci(n - 2); // 계산 결과 저장
}
public static void main(String[] args) {
dp[0] = 0;
dp[1] = 1;
System.out.println(fibonacci(10)); // 10번째 피보나치 수 출력
}
}
3. Bottom-Up Approach
public class Main {
public static int[] dp = new int[31]; // 결과 저장을 위한 배열
public static void main(String[] args) {
dp[0] = 0;
dp[1] = 1;
for(int i = 2; i <= 10; i++) { // 작은 문제부터 차례대로 해결
dp[i] = dp[i - 1] + dp[i - 2];
}
System.out.println(dp[10]); // 10번째 피보나치 수 출력
}
}728x90
반응형
'이론 > 자료구조와 실습' 카테고리의 다른 글
| Sort) Quick Sort, Merge Sort, Heap Sort (1) | 2024.09.29 |
|---|---|
| Sort) Bubble Sort, Selection Sort, Insertion Sort (0) | 2024.09.29 |
| Stack) Stack (0) | 2024.01.05 |
| Queue) Priority Queue (1) | 2024.01.03 |
| Queue) Circular Queue (1) | 2024.01.03 |