반응형
다이나믹 프로그래밍을 활용하는 문제이다.
메모리 제한에 대한 생각 없이 단순히 메모이제이션에 대한 아이디어만 가지고 문제를 풀면 다음과 같은 풀이를 생각할 수 있다.
import sys, copy
input = sys.stdin.readline
n = int(input())
dp_max = [list(map(int, input().split())) for _ in range(n)]
dp_min = copy.deepcopy(dp_max)
for i in range(1, n):
# 0
dp_max[i][0] += max(dp_max[i - 1][0], dp_max[i - 1][1])
dp_min[i][0] += min(dp_min[i - 1][0], dp_min[i - 1][1])
# 1
dp_max[i][1] += max(dp_max[i - 1])
dp_min[i][1] += min(dp_min[i - 1])
# 2
dp_max[i][2] += max(dp_max[i - 1][1], dp_max[i - 1][2])
dp_min[i][2] += min(dp_min[i - 1][1], dp_min[i - 1][2])
print(max(dp_max[n - 1]), min(dp_min[n - 1]))
# arr과 똑같은 배열 만들고 거기까지 가는 비용 저장
# 해당 점에 도달할때 최대값 1층->2층까지 비용 계산, 1->2층 + 2->3층 계산...
2096번 내려가기 문제는 누적 이동 비용과 다음 층으로 이동하기 위한 비용 딱 두개만 기억하면 된다.
층별로 3 칸이 필요하니 길이가 3인 배열 2개만 있다면 충분히 해결할 수 있다는 뜻이다.
import sys
input = sys.stdin.readline
n = int(input())
dp_max, dp_min = [0] * 3, [0] * 3
for i in range(n):
a, b, c = map(int, input().split())
tmp_max, tmp_min = [a, b, c], [a, b, c]
# 0
tmp_max[0] += +max(dp_max[0], dp_max[1])
tmp_min[0] += +min(dp_min[0], dp_min[1])
# 1
tmp_max[1] += max(dp_max)
tmp_min[1] += min(dp_min)
# 2
tmp_max[2] += max(dp_max[1], dp_max[2])
tmp_min[2] += min(dp_min[1], dp_min[2])
for j in range(3):
dp_max[j], dp_min[j] = tmp_max[j], tmp_min[j]
print(max(dp_max), min(dp_min))
반응형
'코딩 > 백준(BOJ)' 카테고리의 다른 글
백준 BOJ 4673번 셀프 넘버 실버5 - Python 풀이 (1) | 2023.10.23 |
---|---|
백준 BOJ 2839번 설탕 배달 실버4 - Python 풀이 (1) | 2023.10.22 |
백준 BOJ 1976번 여행 가자 골드5 - Python 풀이 (0) | 2023.10.20 |
백준 2589번 보물섬 골드5 - Python 풀이 (0) | 2023.10.18 |
백준 11000번 강의실 배정 골드5 - Python 풀이 (0) | 2023.10.12 |
댓글