프로그래밍/알고리즘

동적 프로그래밍 (DP, Dynamic Programming)

Mt.Hwang 2025. 4. 29. 11:30

 * 동적 프로그래밍 (DP, Dynamic Programming)

이미 계산한 결과를 저장해 두었다가 필요할 때 다시 사용하는 방식
위의 개념을 메모이제이션 (Memoization)이라고 한다

복잡한 문제를 더 간단한 하위 문제로 나누어 품

동적 프로그래밍 키워드는
 1. 비슷한 문제는 반복해서 풀지 않음
 2. 한번 푼 것은 기억해서
 3. 필요할 때 재활용

..~~~~..

 * 동적 프로그래밍의 조건

 1. 중복되는 하위 문제 (Overlapping Subproblems)
큰 문제를 푸는 과정에서, 같은 하위 문제가 여러번 반복되어 등장

 2. 최적 부분 구조 (Optimal Substructure)
문제의 정답이 하위 문제의 정답으로부터 쉽게 구성

..~~~~..

 * 동적 프로그래밍 구현 방식

 1. Top-Down
필요할 때 계산하는 방식

재귀 + 메모이제이션 사용
큰 문제 -> 작은 문제로 분할

간단하고 이해하기 쉬움
but, 재귀 깊이가 깊으면 -> 스택 오버플로우 문제 있음


 2. Bottom-Up
처음부터 모든 경우를 계산하는 방식

반복문 + 테이블(주로 배열) 사용
작은 문제로부터 시작해서 -> 큰 문제 해결

시간, 공간 자원 사용이 적다

..~~~~..

 * 동적 프로그래밍으로 푸는 방법

 1. 상태 정의 필요 (State)
dp[index]는 index까지 계산했을 때의 최적 결과를 의미한다

 2. 점화식 설계 (Recurrence Relation)

 3. 초기 조건을 명확히 설정 (Base Case)

..~~~~..

 * 배열 크기 주의할 점

점화식에서 접근하는 최대 인덱스보다 배열의 크기가 커야 한다

Math.max()를 이용해서 배열의 크기를 정하도록 하자
int [] dp = new int [Math.max()]

..~~~~~..