[파이썬] 백준 2096번 내려가기

작성:

백준 #2096 내려가기


  • 출력: 최대 점수, 최소 점수

  • 체크할 조건
    • 1 <= N <= 100000
    • 세 줄
  • 최대인 경우, 최소인 경우 각각 dp



1. 틀린 풀이 (메모리 초과)

import sys
input = sys.stdin.readline

def solution(N):
    raw = [list(map(int, input().split())) for i in range(N)]
    dp_max = [[0] * 3 for i in range(N)]
    dp_min = [[0] * 3 for i in range(N)]
    dp_max[0] = raw[0].copy()
    dp_min[0] = raw[0].copy()
    for i in range(1, N):
        dp_max[i][0] = max(dp_max[i-1][0], dp_max[i-1][1]) + raw[i][0]
        dp_max[i][1] = max(dp_max[i-1]) + raw[i][1]
        dp_max[i][2] = max(dp_max[i-1][1], dp_max[i-1][2]) + raw[i][2]
        dp_min[i][0] = min(dp_min[i-1][0], dp_min[i-1][1]) + raw[i][0]
        dp_min[i][1] = min(dp_min[i-1]) + raw[i][1]
        dp_min[i][2] = min(dp_min[i-1][1], dp_min[i-1][2]) + raw[i][2]
    print(max(dp_max[-1]), min(dp_min[-1]))

if __name__ == '__main__':
    solution(int(input()))
  • 다이나믹 프로그래밍 진행 과정을 모두 배열에 넣으면 메모리가 초과된다.



2. 정답

import sys
input = sys.stdin.readline

def solution(N):
    line = list(map(int, input().split()))
    mx_line = line.copy()
    mn_line = line.copy()
    for _ in range(N-1):
        new_line = list(map(int, input().split()))
        mx_line = [
            max(mx_line[0], mx_line[1]) + new_line[0],
            max(mx_line) + new_line[1],
            max(mx_line[1], mx_line[2]) + new_line[2]
        ]
        mn_line = [
            min(mn_line[0], mn_line[1]) + new_line[0],
            min(mn_line) + new_line[1],
            min(mn_line[1], mn_line[2]) + new_line[2]
        ]
    print(max(mx_line), min(mn_line))

if __name__ == '__main__':
    solution(int(input()))

댓글남기기