Dynamic Programming (3)
동적 계획법
- 일반적으로는 최적화 문제(촤대값 & 최소값, Optimisation Problem) 혹은 카운팅(Counting) 문제에 주로 적용된다.
- 주어진 문제에 대한 순환식(Recurrence Equation)을 정의한다.
- 정의한 순환식을 Memorization 혹은 Bottom-Up방식으로 변환한다.
- Sub Problem들을 풀어 원래의 문제를 푸는 방식이다. 그러한 의미에서 본다면 분할 정복법과도 공통점을 찾을 수 있다.
- 분할 정복법에서는 분할된 문제들이 서로 Disjoint하지만, 동적계획법은 그렇지 않다.
- 서로 Overlapping하는 sub problem들을 해결함으로 원래의 문제를 해결하게 된다.
분할 정복법 vs 동적 계획법
- quick sort의 경우
pivot을 기준으로 분할된 두 subproblem은 서로 disjoint하다고 할 수 있다.
- 행렬 경로 문제의 경우
Optimal Substructure
- 어떠한 문제의 최적 해가 그 문제의 subproblem들의 최적 해로부터 효율적으로 구해질 수 있다고 할 때 그 문제는 곧 optimal substructure를 가진다고 한다.
- 분할 정복법, 탐욕적 기법, 동적 계획법은 모두 문제가 가진 위의 특성을 이용한 풀이법이다.
Optimal Substructure를 확인하는 법
- 최적 해의 일부가 여전히 그 부분에 대한 최적 해인지의 여부 파악
- 최단 경로 문제
- 순환식은 optimall substructure로 표현한다.
- 최장 경로(Longest-Path) 문제
노드를 중복하여 방문하지 않고 목적지까지 가는 가장 긴 경로
optimal substructure를 가지는가?
-> 아래의 예시를 보듯이 3까지 갈 때 4를 거쳐 가는 것이 가장 긴 경로이지만 이는 1~4까지 가는 최장경로를 지날 때 지날 수 없는 경우의 수이기 때문에 최적 해의 일부분이 여전히 그 부분의 최적 해인가에 대한 답을 줄 수 없게 된다.
-> 하지만 optimal substructure을 갖지 않는것이 아닌 조금 더 복잡한 형태를 띄고 있어 여전히 동적 계획법을 이용하여 문제를 해결할 수 있다.
'프로그래밍 > 알고리즘' 카테고리의 다른 글
동적 계획법(5) - Knapsack (0) | 2019.07.01 |
---|---|
동적 계획법(4) - 행렬 곱 & LCS (0) | 2019.07.01 |
동적 계획법 (2) - 경로 탐색 (0) | 2019.06.28 |
동적 계획법 (1) - Fibonacci & Binomial (0) | 2019.06.27 |
압축 (4) (0) | 2019.06.24 |