
DP는 큰 문제를 작은 문제로 나누고, 그 결과를 저장하여 재활용하는 방식으로 문제를 해결하는 기법이다.
핵심 요약
문제를 쪼갤 수 있는지 확인
점화식 도출
중복 계산 여부 확인
저장할 값 정의
기본값 설정
순차적 계산
dp[i] = i번째 원소를 끝으로 하는 증가 부분 수열의 최대합
dp[i] = max(dp[i], dp[j] + arr[i]) (단, arr[j] < arr[i])
arr[i]보다 작은 이전 원소 arr[j]를 탐색이전 원소 중 자신보다 작은 값에 이어붙인 최대합을 선택하는 구조
dp[i] = 카드 i개를 구매할 때의 최대 금액
dp[i] = max(dp[i - j] + arr[j - 1]) (1 ≤ j ≤ i)
모든 가능한 조합을 비교하고, 최대값을 선택하는 반복 구조
dp[n] = 길이 2n인 올바른 괄호 문자열의 개수
dp[n] = dp[0]*dp[n-1] + dp[1]*dp[n-2] + ... + dp[n-1]*dp[0]
전체 구조를 좌우 두 부분으로 나누고, 각 조합의 곱을 누적하는 구조
| 문제 | 핵심 사고 | 저장 기준 | 점화식 형태 |
|---|---|---|---|
| 11055 | 이전 원소 합의 최댓값 | 마지막 원소 기준 | 누적 최대값 |
| 11052 | 가능한 구매 조합 | 카드 개수 기준 | 조합 최댓값 |
| 10422 | 괄호 구조 분할 | 괄호 쌍 개수 기준 | 곱의 누적 |
DP는 단순한 배열 채우기가 아니라,
작은 단위 문제의 결과를 이용해 전체 문제를 해결하는 사고 과정이다.
핵심 포인트
1. dp[i]의 의미를 명확히 정의
2. 이전 결과로 현재를 유도하는 점화식 구성
3. 중복 계산 제거
4. 누적 계산을 통해 전체 문제 해결
세 문제 모두 공통적으로 “변하지 않는 하위 문제의 패턴”을 기반으로 동작하며,
이 패턴을 찾는 것이 DP 문제 해결의 핵심이다.