티스토리 뷰
다이나믹 프로그래밍이란 하나의 문제를 단 한 번만 풀도록 하는 알고리즘
- 분할 정복 기법은 '정렬'과 같은 몇몇 요소에 대해 동일한 문제를 다시 푼다는 단점을 가지고 있음.
- 단순 분할 정복으로 풀면 심각한 비효율을 낳는 대표적인 예시로 피보나치 수열이 있음
- 피보나치 수열의 점화식
- D[i] = D[i - 1] + D[i -2]
- 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
- 이런 경우 병합 정렬처럼 단순 분할 정복 기법을 사용하는 경우 이미 해결한 문제를 다시 반복적으로 해결하여 비효율적임
- 다이나믹 프로그래밍 가정
- 1번 가정
- 큰 문제를 작은 문제로 나눌 수 있음
- 2번 가정
- 작은 문제에서 구한 정답은 그것을 포함하는 큰 문제에서도 동일함
- 크고 어려운 문제가 있다면 먼저 잘게 나누고 해결하여서 나중에 전체의 답을 구하는 것
- Memorization
- 이미 계산한 결과는 배열에 저장하여 나중에 동일한 계산을 해야할 때 저장된 값을 단순히 반복하면 됨
- 아래 코드에서 d 배열에 값들을 저장
- 1번 가정
- 피보나치 수열의 점화식
public class DynamicProgramming {
static int d[] = new int[100];
public static int dp (int x) {
if(x == 1) return 1;
if(x == 2) return 1;
if(d[x] != 0) return d[x];
return d[x] = dp(x - 1) + dp(x - 2);
}
public static void main(String[] args) {
System.out.println(DynamicProgramming.dp(50));
}
}
'algorithm' 카테고리의 다른 글
[입출력] 10953, 11021, 11718 (0) | 2020.04.07 |
---|---|
[입출력] 1000, 2558, 10950 (0) | 2020.04.06 |
CountingSort with java (0) | 2020.01.24 |
HeapSort with java (0) | 2020.01.24 |
MergeSort with java (0) | 2020.01.24 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- react
- C++
- server side rendering
- 이진탐색
- javascript
- 클래스
- 병행프로세스
- Stack
- 퀵정렬
- 입출력장치
- Java
- 알고리즘
- 인접리스트
- 소프트웨어
- C
- 최단경로
- 스텍
- dfs
- 운영체제
- 동적프로그래밍
- 구조체
- client side rendering
- BFS
- 인접행렬
- 세마포어
- 재귀함수
- stackframe
- 배열
- 자료구조
- 교착상태
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함