| 항목 | 설명 | 예시 |
|---|---|---|
| ① 기저 조건 (Base Case) | 재귀나 반복이 종료되는 조건 | if (i >= n) return 0; |
| ② 점화식 (Recurrence Relation) | 큰 문제를 작은 문제로 쪼갤 수 있는 규칙 | dp[i] = cost[i] + min(dp[i+1], dp[i+2]) |
| ③ 메모이제이션 (Memoization) | 이미 구한 결과를 기억해두기 | map.put(i, result) |
| ④ 기본 구조 | 재귀(Top-down) 또는 반복문(Bottom-up) | result(i), for문 |
if (i >= cost.length) return 0;
→ 계단을 다 오르면 추가 비용은 0이니까 여기서 멈추는 것
dp[i] = cost[i] + min(dp[i+1], dp[i+2]);
→ 지금 위치의 비용 + 다음 계단 중 더 적은 비용
if (memo.containsKey(i)) return memo.get(i);
→ 이미 계산한 위치는 다시 계산 안 함
int dp(int i) {
if (i >= cost.length) return 0;
if (memo.containsKey(i)) return memo.get(i);
int result = cost[i] + Math.min(dp(i+1), dp(i+2));
memo.put(i, result);
return result;
}
int[] dp = new int[n];
dp[0] = cost[0];
dp[1] = cost[1];
for (int i = 2; i < n; i++) {
dp[i] = cost[i] + Math.min(dp[i-1], dp[i-2]);
}
return Math.min(dp[n-1], dp[n-2]);
[DP 알고리즘 구조]
1. 기저 조건 → 언제 멈출지?
2. 점화식 → 앞/뒤 값으로 계산하는 규칙
3. 메모이제이션 → 계산한 값 저장
4. 구조 → top-down(재귀) or bottom-up(반복문)
| 문제 | n번째 피보나치 수를 구하라 (1, 1, 2, 3, 5, 8, …) |
| 점화식 | dp[n] = dp[n-1] + dp[n-2] |
| 기저조건 | dp[1] = 1, dp[2] = 1 |
| 메모이제이션 | Map 또는 int[] dp |
| 구조 | top-down: 재귀 + memo / bottom-up: 반복문 |