🌹 정리 by 장미(https://velog.io/@newbiekim/)

Dynamic Programming은 Optimization Problem을 해결하는 전략 중 하나이다.

여기서 Optimization Problem이란, 문제를 해결하는 최적의 답(Optimal Solution)을 찾아야 하는 문제를 뜻한다.

Optimal Solution은 하나 이상일 수 있으며, 최대 혹은 최소값을 가지는 Solution을 찾는 문제들이 주를 이룬다. (예: 가장 빨리 도착하는 경로(Solution)의 소요 시간(Value)은? 등…)

DP는 해결하려는 문제를 좀 더 작은 크기의 SubProblem으로 나누고, 그 SubProblem의 Optimal Solution을 활용하여 원래 Problem의 Optimal Solution을 찾는 방식이다.

여기서 문제를 계속 잘게 쪼개다 보면, 어느 순간 겹치는(Overlapping) SubProblem이 생긴다. 그럴 때 이 서브 문제들을 계속 계산하는 것이 아니라 맨 처음 한 번만 계산을 하고, 그 결과를 저장한 뒤에 필요하다면 또 재사용한다.

DP의 두 가지 접근 방식

Top-Down Approach Bottom-Up Approach
구조 Recursive(재귀) Iterative(for-loop)
SubProblem
결과 저장 Memoization Tabulation
선호되는 상황 SubProblems의 일부만 계산해도 최종 Optimal Solution을 구할 수 있을 때 모든 SubProblems를 계산해야 최종 Optimal Solution을 구할 수 있을 때

Top-Down Approach는 문제들을 작은 크기의 문제로 나누어서 해결하는 것이고, Bottom-Up Approach는 일단 작은 크기의 문제부터 차근차근 해결해 나가는 것이다.

DP를 사용한 알고리즘 설계 순서

  1. 주어진 문제의 Optimal Solution이 구조적으로 어떤 특징을 가지는지 분석한다.
  2. 재귀적인 형태로 Optimal Solution의 Value를 정의한다.
  3. (주로) Bottom-Up 방식으로 Optimal Solution의 Value를 구한다.
  4. 지금까지 계산된 정보를 바탕으로 Optimal Solution을 구한다. (Optimal Solution을 구해야 할 경우)

예제