
큰 문제를 작은 문제로 나누어 푸는 것
Divide and Conquer (분할 정복)과 비슷해 보이지만, 이와 다르게 Dynamic Programming (동적 계획법)은 작게 나눈 문제가 반복되는 특성을 활용합니다. 즉, 작은 부분 문제들이 여러 번 등장하지만 그 결과가 변하지 않는다는 점을 이용해 한 번 계산한 결과를 저장하고 재활용함으로써 효율적으로 문제를 해결합니다.
동적계획법을 위한 두 가지 핵심 조건은 다음과 같습니다.
동적 계획법을 구현하는 두 가지 방식은 다음과 같습니다.

Top-down (메모이제이션, Memoization)
재귀 + 메모이제이션 방식으로 큰 문제를 재귀적으로 풀다가, 이미 푼 하위 문제가 나오면 저장된 값을 사용합니다.
Bottom-up
작은 문제부터 차례대로 해결하며 결과를 배열에 저장합니다. 재귀 호출 없이 반복문만 사용합니다.
사진 출처: Demystifying Dynamic Programming in Java: Bottom-Up and Top-Down Approaches Explained