동적 계획법 (Dynamic Programming)

1. 동적 계획법 (Dynamic Programming)의 개념 및 특징

개념복잡한 문제 해결 위해 하위 문제로 나누어 점화식을 도출하고 초기 해와 점진적 해를 계산하는 상향식 문제해결 접근 전략
특징상향식 문제 해결
(Bottom-Up Approach)
– 문제를 하위 문제로 분할하고 하위 문제 해결 후 결과 재사용
최적성의 원리 적용– 주어진 문제 최적해가 분할된 부분 문제에 대한 최적해로 구성
점화/재귀 관계식 적용– 하위 문제들이 서로 독립적이지 않고 점화/재귀 관계식 도출
  • 반복 요소 존재, 하위 문제가 기하급수적으로 증가하는 경우 효과적 최적해 도출 기법으로 활용
  • 예를 들어, 피보나치 수열은 F[n] = F[n-1] + F[n-2] + … 점화식을 통해 동적 계획법을 활용하여 문제해결

 

2. 동적 계획법의 전제 조건/동작 원리 및 프로세스

(1) 동적 계획법의 전제 조건/동작 원리

전제
조건
– 최적성 원리 만족 시 점화/재귀 관계식 도출 가능하여 동적 계획법 적용 가능
– 점화 재귀 관계식 도출 : an+1 = f(an) [함수 f(an): 수열 {an}의 점화식점화식, an/an+1: 인접 항]
동작
원리
최적의 하부 구조
(Optimal substructure)
– Problem의 최적해 안에 sub-problem에 대한 최적해가 존재
– 최적 해 비용 = 각 product A1 … Ak와 Ak+1 … An의 계산 비용 + 두 product의 곱셈 비용
하위 문제 중복
(Overlapping Sub-problem)
– 문제를 하위 문제로 분할 시 중복되는 계산 문제 존재
– 동일한 하위 문제 반복 수행 시 최적화 문제는 Overlapping Sub-problem을 가진다고 표현

(2) 동적 계획법의 프로세스

  • 동적 계획법은 분할정복 기법과 같이 부분 문제의 해를 결합해 문제를 해결하는 방식이지만, 해를 저장 후 재사용하는 방식 등 차이점 존재

 

3. 동적 계획법의 사례 및 유사 문제해결 전략 비교

(1) 동적 계획법의 사례 (피보나치 수열 사례)

피보나치 수열
구현 코드
int fib(int n)
{
    f[1] = f[2] = 1;
    for (int i=3; i<=n; i++)
        f[i] = f[i-1] + f[i-2];
    return f[n];
}
피보나치 수열
구현 방식

(2) 동적 계획법과 유사 문제해결 전략 비교

비교 항목분할과 정복
(Devide & Conquer)
동적 계획법
(Dynamic Programming)
탐욕법
(Greedy Method)
문제 해결
접근 방식
– 최소 문제로 분할하여 원래의 문제 해를 구하는 방식– 하위 문제의 해 저장 후 큰 문제의 해를 점진적으로 구하는 방식– 현재 단계에서 국부적 최적 해를 선택하여 전체 해를 구하는 방식
주요 특징– 하향식 접근
– 분할 → 정복 → 결합
– 상향식 접근
– 메모이제이션
– 국부적 최적 해 선택
– 근사치 추정
주요
알고리즘
– 이진 탐색 알고리즘
– 병합 정렬 알고리즘
– 플로이드-워셜 알고리즘
– 피보나치 수열
– 최소 신장 트리
– 동전 거스름돈 문제
  • 동적 계획법을 이용한 문제해결 접근 시 점화식의 복잡도에 따라 계산 성능이 좌우되므로 점화식은 최대한 단순화 필요

 
[참고]

  • 로버트 세지윅 외, 길벗, 알고리즘, 2018
  • 권오흠, 국립부경대학교, 알고리즘

콘텐츠 사용 시 출처 표기 부탁 드리고, 댓글은 큰 힘이 됩니다^^