Dynamic Programming(DP, 동적 계획법)

모든 경우의 수를 조합해 최적의 해법 찾기

문제를 여러 개의 (작은) 하위 문제로 나누어 풀고, 하위 문제들의 해결 방법을 결합하여 최종 문제를 해결

하나의 문제는 단 한 번만 풀도록 하는 알고리즘

조건

  • Overlapping Sub-problems(부분 반복 문제) - 큰 문제를 작은 문제로 나눌 수 있고, 작은 문제가 중복해서 발견
  • Optimal Substructure(최적 부분구조) - 작은 문제에서 구한 정답은 큰 문제에서도 사용 가능

Overlapping Sub-problems


피보나치 수열

function fib(n) {
  if (n <= 2) {
    return 1;
  }
  return fib(n - 1) + fib(n - 2);
}
피보나치 수열


fib(5) 는 두 번, fib(4) 는 세 번, fib(3) 은 다섯 번의 동일한 계산을 반복

주어진 문제를 단순히 반복 계산하여 해결하는 것이 아니라, 작은 문제의 결과가 큰 문제를 해결하는 데에 여러 번 사용될 수 있어야 함


Optimal Substructure


정답은 최적의 해결 방법(Optimal solution)을 의미

작은 문제들의 최적의 해법(Optimal solution of Sub-problems)을 찾아야 함

결국 전체 문제의 최적의 해법(Optimal solution) 구할 수 있음

방향성 그래프 예시


A에서 D로 가는 최단 경로는 작은 문제인 A에서 C로 가는 최단 경로, 그리고 한 번 더 작은 문제인 A에서 B로 가는 최단 경로의 파악 가능

댓글남기기