다이나믹 프로그래밍(동적 계획법)
- 큰 문제를 작은 문제로 나눠서 푸는 알고리즘
- DP → 중복⭕ 분할정복(Divid & Conquer) → 중복❌
- 정답을 한 번 구했으면, 정답을 어딘가에 메모해놓는다(memorization)
Overlapping Subproblem(중복되는 부분 문제): 문제를 작은 문제로 쪼갤 수 있다. 큰 문제와 작은 문제를 같은 방법으로 풀 수 있다
Optimal Substructure(최적 부분 구조): 문제의 정답을 작은 문제의 정답에서 구할 수 있다
int memo[100];
int fibonacci(int n){
if( n <= 1 ) {
return n;
}
else {
if(memo[n] > 0){
return memo[n];
}
memo[n] =fibonacci(n-1) + fibonaccai(n-2);
return memo[n];
}
}
//시간복잡도: O(N)
//문제 개수 * 문제 1개를 푸는 시간 -> N * O(1)
- 구현 방식
- Top-down(재귀)
- Bottom-up(반복문)
문제 풀이
- 주어진 문제가 다이나믹 프로그래밍 유형인지 파악하는 것이 중요
- 큰 문제를 단계 하나와 나머지 단계로 나누어 풀면 된다
- 답을 아직 구하지 않았다는 의미로 -1을 사용하면 좋음(특히 min값 구할 때)
- 연속 또는 증가는 2개의 수를 비교하는 식으로 풀어가면 된다(추가했을때 아닐때 비교 등등)
반응형
'알고리즘 > 공부' 카테고리의 다른 글
[알고리즘] 위상정렬(Topological Sort) (0) | 2022.01.11 |
---|---|
[알고리즘] 유니언 파인드(Union Find) (0) | 2022.01.10 |
[알고리즘] 인덱스 트리(Indexed Tree) (1) | 2022.01.05 |
[알고리즘] 그래프 (0) | 2021.09.20 |
[알고리즘] 수학 (0) | 2021.09.20 |