티스토리 뷰
https://www.acmicpc.net/problem/1126
1126번: 같은 탑
첫째 줄에 조각의 개수 N이 주어진다. N은 50보다 작거나 같은 자연수이다. 둘째 줄에 각 조각의 높이가 주어진다. 높이는 500,000보다 작거나 같은 자연수이고, 모든 조각의 높이의 합은 500,000을 넘
www.acmicpc.net
DP 냄새가 강하게 나는 문제이다.
낮은 탑 높이의 최대값을 f(idx, diff)로 두면.
아래와 같이 점화식을 세울 수 있다.
1. f(-1, 0) = 0
2. f(idx, diff) = max( [1], [2], [3])
2-1. [1] : f(idx - 1, diff)
2-2. [2] : f(idx - 1, diff + a[idx]) + a[idx]
2-3. [3] : f(idx - 1, diff - a[idx]) + abs(min(diff - a[idx], 0) )
2-1 : idx번째 블록을 사용하지 않는 경우
2-2 : idx번째 블록을 낮은 탑에 놓았는데, 여전히 낮은 탑이 높은 탑보다 낮을 때
2-3 : (생각할 거리가 많은 부분이다.) 두가지 경우의 수가 있다.
(1) diff - a[idx] >= 0 : idx번째 블록을 높은 탑에 놓은 경우.
=> f(idx - 1, diff - a[idx])
(2) diff - a[idx] < 0 : idx 번째 블록을 낮은 탑에 놓았는데, 높은 탑보다 더 높아진 경우.
=> 이 경우, 낮은 탑과 높은탑이 서로 바뀌면서 값의 증가가 발생한다.
=> f(idx - 1, diff - a[idx]) + a[idx] - diff
이 점화식으로 N * height 시간에 풀린다.
점화식을 아래와 같이 쉽게 세우면
[쉬운 점화식 1] f(idx, left_height) = right_height
[쉬운 점화식 2] f(idx, diff) = {left_height, right_height} ( * diff = left_height - write_height )
수식과 코드는 조금 덜 아름답겠지만...
직관적인 수준에서 코드를 짤 수 있으므로, 고민은 덜해도 될 것 같다.
'Problem Solving' 카테고리의 다른 글
boj 20193: 화려한 정사각형 (0) | 2022.04.18 |
---|---|
boj 1214 : 쿨한 물건 구매 (0) | 2021.06.11 |
boj 1017 : 소수 쌍 (0) | 2021.06.01 |
codeground : Rectangles [SCPC 2016 - 2차 예선] (0) | 2016.10.12 |
codeground : 프리랜서 [SCPC 2016 - 2차 예선] (0) | 2016.10.12 |
- Total
- Today
- Yesterday
- 10159
- BOJ
- boj 1806
- 문제 풀이
- boj 용액
- dp
- 풀이
- boj 1799
- 백준 2467 용액
- 백준 비숍
- 백준
- 백준 1647
- boj 7579
- 백준알고리즘
- 백준 앱
- 백준 7579 앱
- 도시 분할 계획
- 백준 1806
- 백준 도시 분할 계획
- scpc
- 알고리즘
- 백준 1799
- SCPC 2016
- 백준 용액
- 2469
- codeground
- 연습문제
- 백준 부분합
- boj 앱
- 네블컵 2회
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |