Dynamic Programming
정의
- 복잡한 문제를 간단한 여러 개의 문제로 나누어 푸는 방법
원리
- 문제를 여러 개의 하위 문제(subproblem)로 나누어 푼 다음, 그것을 결합하여 최종적인 목적에 도달
- 각 하위 문제의 해결을 계산한 뒤, 그 해결책을 저장하여 후에 같은 하위 문제가 나왔을 경우 그것을 간단하게 해결
예제
- 막대기 자르기 ( 막대기를 적절히 잘라서 가장 가격이 높게 만들어야 함)
1 | 길이(i) 0 1 2 3 4 5 6 7 8 9 10 |
- 길이가 4인 막대기로 자를 때 얻을 수 있는 최대 가격 : 길이 2인 막대기 두 개로 자름. -> 5 + 5 = 10
- 길이가 6인 막대기 : 자르지 않고 그대로
- 길이가 n인 막대기의 최대 가격 = Rn = max(Pi + Rn-i) (i는 1부터 n)
- R1 = max(P1 + R0) =1
- R2 = max(P1 + R1, P2 + R0) = 5
- R3 = max(P1 + R2, P2 + R1, P3 + R0) = 8
- R4 = max(P1 + R3, P2 + R2, P3 + R1) = 10
–> R1, R2, R3… 가 반복적으로 나옴 . 메모제이션 사용. 이전에 계산한 값들 저장.