[백준/코틀린] 2096번: 내려가기
골드 5
링크
풀이
maxDp[i]: i번째 칸까지의 최대 누적 합
minDp[i]: i번째 칸까지의 최소 누적 합
주어진 그림을 뒤집어 생각하면, 현재 칸에 도달할 수 있는 위치를 알 수 있습니다.
윗줄에서 도달 가능한 위치들 중, 최댓값과 최솟값을 각각 더해 현재 칸의 누적 합을 계산합니다.
메모리 초과를 방지하기 위해 공간 최적화 방식을 사용합니다.
전체 테이블을 저장하지 않고, 이전 줄의 최대/최소 누적 합만 유지하며 갱신합니다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
fun main() {
val n = readln().toInt()
val maxDp = IntArray(3)
val minDp = IntArray(3)
repeat(n) {
val (a, b, c) = readln().split(" ").map { it.toInt() }
val (M0, M1, M2) = maxDp
val (m0, m1, m2) = minDp
maxDp[0] = a + maxOf(M0, M1)
maxDp[1] = b + maxOf(M0, M1, M2)
maxDp[2] = c + maxOf(M1, M2)
minDp[0] = a + minOf(m0, m1)
minDp[1] = b + minOf(m0, m1, m2)
minDp[2] = c + minOf(m1, m2)
}
println("${maxDp.maxOrNull()} ${minDp.minOrNull()}")
}
This post is licensed under CC BY 4.0 by the author.
