다이나믹 프로그래밍
하나의 문제는 한 번만 계산하는 알고리즘으로 큰 문제를 작은 문제로 나누어 푸는 알고리즘
다이나믹 프로그래밍을 사용하기 위한 조건
-작은 문제로 나눌 수 있을 때
-작은 문제의 답이 그것을 포함하며 더 큰 문제에서도 답이 동일하게 나올 때
다이나믹 프로그래밍 원리
메모이제이션을 활용해 작은 문제에서 계산한 결과 값을 배열에 저장해두고
나중에 큰 문제에서 그 값이 다시 필요할 때 동일한 계산을 진행하지 않고 저장된 값을 반환받아서 계산
+메모이제이션
결과를 저장해 함수가 한 번만 실행되는 것을 보장하는 기술
동적계획법을 쓸 때 많이 사용한다.
다이나믹 프로그래밍 구현법
1. 탑-다운
재귀함수로 구현할 때 대부분 탑-다운 방식을 사용하며 큰 문제를 풀 때
작은 문제 값이 없다면 그 때 작은 문제의 값을 계산함.
2. 다운-탑
작은 문제부터 먼저 계산하여 큰 문제의 값을 계산함.
다이나믹 프로그래밍 점화식 찾는 법
1. 작은 문제들의 값(0,1,2,3,3)들을 직접 계산해보면 점화식이 보임
그 점화식을 활용해 다이나믹 프로그래밍을 구현하면 됨.
2. 이전 단계에서 다음 단계로 가는 가짓수가 정해져있다면 그걸 이용해도 됨
ex. 도형을 쪼갤 때 특정한 규칙으로만 쪼개져서 n-2단계/n-1단계에서 n이 되는
가짓수가 정해져있을 경우
분할 정복 vs 다이나믹 프로그래밍
분할 정복은 단순히 큰 문제를 작은 문제로 나누어 푸는 것으로 작은 문제의 답이 항상
큰 문제의 답이 되지 않아 작은 문제를 여러 번 반복적으로 계산해야 함.
반면에 다이나믹 프로그래밍은 작은 문제 계산을 중복적으로 하지 않고 작은 문제의 답이
큰 문제에서도 변하지 않음을 이용함
참고 사이트
'cs > 알고리즘' 카테고리의 다른 글
[알고리즘] 재귀(recursion) (0) | 2022.01.21 |
---|---|
[알고리즘] 비트마스크(Bitmask) (0) | 2022.01.10 |
C++ 실행 속도 향상 ios_base::sync_with_stdio(0); cin.tie(NULL); (0) | 2021.09.18 |
[알고리즘] 브루트 포스(Brute Force) (0) | 2021.09.12 |
[알고리즘] 소수 구하기 (0) | 2021.09.11 |