728x90
Dynamic Programing
- recursion + Memoization
- 단순 테이블 채우기가 아니라 memoization을 이용해서 recursion을 smart하게 하는 기법.
# 문제해결 절차
- 문제를 정확하게 정의하기.
- 정의된 문제에 대한 subproblem을 생각한 뒤 이를 이용해 reccurence relation을 세운다.
- A(i)를 해결하기 위해서 이전단위의 subproblem의 solution으로 현재 해결하고자하는 식을 논리적으로 구한다.
- memoization을 이용하여 recurrence relation 계산
- 중간 결과물들을 저장할 data structure을 고른다. 대개 n차원 array 사용.
- Subproblem들간의 dependency를 확인한다. (보통 top-down | bottom-up)
- top-down이 bottom-up보다 빠르다.
- bottom-up이 top-down보다 직관적이다.
- top-down으로 실행이 되는데 bottom-up으로 실행이 안된 적이 거의 드물다. 때문에 대개 bottom-up으로 진행한다.
- dependency에 기반하여 subproblem들의 답을 구하는 순서를 정하기.
# 적용 문제
- 구간 합, LIS( Longest Increasing Subsquence), edit, distance, knapsack...
보통 최적화 문제나 경우의 수를 풀때 주로 이용한다.
728x90
'🐣 알고리즘 삐약 > ✌️알고리즘 개념 잡기' 카테고리의 다른 글
[Network Flow] Ford-Fulkerson Algorithm (0) | 2022.05.07 |
---|---|
[Network Flow] 네트워크 플로우 (0) | 2022.05.06 |
[Problem Solving Paradigms] Greedy (0) | 2022.04.20 |
[Problem Solving Paradigms] Bit - Parallel Algorithms (0) | 2022.04.20 |
[Problem Solving Paradigms] Divide and Conquer | 분할 정복 (0) | 2022.04.20 |