BOJ: 2096

문제

N줄에 0 이상 9 이하의 숫자가 세 개씩 적혀 있다. 내려가기 게임을 하고 있는데, 이 게임은 첫 줄에서 시작해서 마지막 줄에서 끝나게 되는 놀이이다.
먼저 처음에 적혀 있는 세 개의 숫자 중에서 하나를 골라서 시작하게 된다. 그리고 다음 줄로 내려가는데, 다음 줄로 내려갈 때에는 다음과 같은 제약 조건이 있다. 바로 아래의 수로 넘어가거나, 아니면 바로 아래의 수와 붙어 있는 수로만 이동할 수 있다는 것이다.
숫자표가 주어져 있을 때, 얻을 수 있는 최대 점수, 최소 점수를 구하는 프로그램을 작성하시오. 점수는 원룡이가 위치한 곳의 수의 합이다.

입력

첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다.

출력

첫째 줄에 얻을 수 있는 최대 점수와 최소 점수를 띄어서 출력한다.


Solution

입력 구현

1
2
3
4
5
6
7
import sys
read = sys.stdin.readline

N = int(read())

for i in range(N):
a, b, c = map(int, read().split())

DP 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
dp1 = [0 for _ in range(3)]
dp2 = [0 for _ in range(3)]
tmp1 = [0 for _ in range(3)]
tmp2 = [0 for _ in range(3)]

for i in range(N):
a, b, c = map(int, read().split())
for j in range(3):
if j == 0:
tmp1[j] = a + max(dp1[j], dp1[j + 1])
tmp2[j] = a + min(dp2[j], dp2[j + 1])
elif j == 1:
tmp1[j] = b + max(dp1[j - 1], dp1[j], dp1[j + 1])
tmp2[j] = b + min(dp2[j - 1], dp2[j], dp2[j + 1])
elif j == 2:
tmp1[j] = c + max(dp1[j - 1], dp1[j])
tmp2[j] = c + min(dp2[j - 1], dp2[j])
for j in range(3):
dp1[j] = tmp1[j]
dp2[j] = tmp2[j]

print(max(dp1), min(dp2))
  • dp1: 최대 점수 보관 리스트
  • dp2: 최소 점수 보관 리스트