본문 바로가기
카테고리 없음

[python] 백준 2096 내려가기

by Alan_Kim 2023. 3. 7.
728x90
반응형

https://www.acmicpc.net/problem/2096

 

2096번: 내려가기

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

www.acmicpc.net

 

문제 해결

사실 문제 자체는 매우 쉽다. (dp를 이용해서 0열, 1열, 2열에 각각 올 수 있는 이전 행 최고 누적합을 가져오서 더하면 되므로)

하지만 메모리가 4MB 밖에 안주어진다. 정확한 양은 체감을 못해도 평소 250~500MB 되는 문제도 많은 것을 보면 엄청 적다는 것을 알 수 있다.

따라서 리스트를 n행 모두 사용하는 것이 아니라(dp[0], dp[1], .... 사용하면 메모리가 커진다..) 한 행만 사용하고 한 줄씩 비교를 해가며 바로 수정해가야한다.

 

CODE

import sys
INF = sys.maxsize
n = int(input())
Mdp = [0]*3
mdp = [0]*3
Mtp = [0]*3
mtp = [0]*3
for _ in range(n):
    a, b, c = map(int, input().split())
    for j in range(3):
        if j==0:
            Mtp[0] = a + max(Mdp[0],Mdp[1])
            mtp[0] = a + min(mdp[0],mdp[1])
        elif j == 1:
            Mtp[1] = b + max(Mdp)
            mtp[1] = b + min(mdp)
        else:
            Mtp[2] = c + max(Mdp[1], Mdp[2])
            mtp[2] = c + min(mdp[1], mdp[2])
    for i in range(3):
        Mdp[i] = Mtp[i]
        mdp[i] = mtp[i]
print(max(Mdp), min(mdp), sep=' ')
728x90
반응형

댓글