practivceAlgorithm/백준

[백준][Python] 2096 내려가기

findTheValue 2021. 8. 11. 10:08

슬라이딩 윈도우. dp의 방식을 차용하되 2칸만 유지해 메모리 효율을 최고로 끌어올림.

import sys
input = sys.stdin.readline

N = int(input())
arr = [list(map(int, input().split())) for _ in range(N)]
max_sum = [[0,0,0],[0,0,0]]
min_sum = [[0,0,0],[0,0,0]]
# 슬라이딩 윈도우 N까지 미끄러짐. // dp를 같이 쓰는데 dp를 모두 저장하는 것이 아니라 전의 값과 현재 계산할 칸만 남겨둠.
for i in range(0,N):

    max_sum[1][0] = max(max_sum[0][1], max_sum[0][0]) + arr[i][0]
    max_sum[1][1] = max(max_sum[0][1], max_sum[0][2], max_sum[0][0]) + arr[i][1]
    max_sum[1][2] = max(max_sum[0][1], max_sum[0][2]) + arr[i][2]

    min_sum[1][0] = min(min_sum[0][0], min_sum[0][1]) + arr[i][0]
    min_sum[1][1] = min(min_sum[0][1], min_sum[0][2], min_sum[0][0]) + arr[i][1]
    min_sum[1][2] = min(min_sum[0][1], min_sum[0][2]) + arr[i][2]

    max_sum.append(max_sum.pop(0))
    min_sum.append(min_sum.pop(0))

print(max(max_sum[0]), min(min_sum[0]))