0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 1 | 5 | 8 | 9 | 10 | 17 | 20 | 24 | 30 |
첫째 줄은 막대기의 길이이다.
둘째 줄은 각 막대기의 가격이다.
한 막대기를 선택해서, 그 막대기를 적절하게 자르든 안 하든, 가장 비싼 가격을 만들어야 한다.
예를 들어 길이 4의 막대기는 2로 나누어서 5+5=10이 최대 가격이 된다.
막대기 n을 선택해 나누려고 하는데,
i를 1부터 시작해서 i : n-i 비율로 나눴다고 생각하자.
예를 들어 막대기 4를 1:3, 2:2, 3:1, 4:0 비율로 나눌 수 있다.
이 때 i는 1부터 n까지 모든 경우를 볼 것이기 때문에 더이상 건들지 말고 표 가격 그대로라고 생각하고,
n-i의 가격을 최대 가격이라고 생각하면
i=n까지 계산 및 비교를 끝냈을 때 n의 최대 가격을 알아낼 수 있을 것이다.
4를 1:3으로 나눴다면 1을 기준점으로 삼고 그냥 두고, 3을 막대기 3의 최대 길이라고 생각하자는 것이다.
이것을 점화식으로 나타내면 다음과 같다.
Rn = max(Pi + Rn-i) (i=1~n. R은 최대 가격, P는 표에 주어진 가격)
R1 = max(P1 + R0)
R2 = max(P1 + R1, P2 + R0)
R3 = max(P1 + R2, P2 + R1, P3 + R0)
R4 = max(P1 + R3, P2 + R2, P3 + R1, P4 + R0)
....
계속해서 R0, R1, R2 등의 계산이 반복되고 있기 때문에 동적 프로그래밍으로 풀어갈 수 있다.
다이나믹 프로그래밍은 점화식을 알아내면 풀 수 있다고 한다.
저 문제를 봤을 때 DP인 것을 인식하고 수식을 생각해낼 수 있을지 솔직히 지금은 자신없지만...
'알고리즘 > 동적프로그래밍' 카테고리의 다른 글
1463. 1로 나누기 (열흘 전과 코드 비교) (0) | 2019.12.03 |
---|---|
2579. 계단 오르기 (0) | 2019.12.03 |
1932번. 정수 삼각형 (0) | 2019.12.03 |
1149. RGB거리 (0) | 2019.12.03 |
1463. 1로 만들기 (0) | 2019.11.19 |