본문 바로가기
문제 해결/BOJ

[백준] 소형기관차

by 자잘 2023. 3. 26.

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

 

2616번: 소형기관차

첫째 줄에 기관차가 끌고 가던 객차의 수가 입력된다. 그 수는 50,000 이하이다. 둘째 줄에는 기관차가 끌고 가던 객차에 타고 있는 손님의 수가 1번 객차부터 차례로 입력된다. 한 객차에 타고 있

www.acmicpc.net

DP 문제입니다. 먼저, 각 인덱스를 시작으로 소형기관차가 연속적으로 태울 수 있는 손님의 수를 계산하여 저장한 다음

각 연속적으로 저장되어 있는 칸이 1 ~ 3번째에 해당하는 경우에 태울 수 있는 최대 손님의 수를 계산해주면 됩니다.

import sys

sys.stdin = open("input.txt","r")
input = sys.stdin.readline


n = int(input())
passengers = list(map(int, input().split()))
m = int(input())

cur = sum(passengers[:m])
memo = [cur]

left, right = 0, m
# 각 인덱스를 시작으로 끌 수 있는 손님들의 수
# ex) 1 ~ 3, 2 ~ 4, 3 ~ 5
while right < n:
    cur -= passengers[left]
    cur += passengers[right]
    left += 1
    right += 1
    memo.append(cur)


#dp[i][j]: j번째 인덱스를 시작으로 i번째 소형 기관차에 탈 수 있는 손님의 최대의 수
dp = [
    [0] * len(memo)
    for _ in range(4)
]

for j in range(len(memo)):
    for i in range(1, 4):
        if j < m:
            dp[i][j] = memo[j]
		# 현재 칸을 시작으로 하는 손님들을 태우거나 태우지 않는 경우중 최대를 선택
        dp[i][j] = max(dp[i - 1][j - m] + memo[j], dp[i][j - 1])

print(dp[3][len(memo) - 1])

'문제 해결 > BOJ' 카테고리의 다른 글

[백준] 색종이 - 3  (0) 2023.03.28
[백준] 마피아  (0) 2023.03.27
[백준] 음악프로그램  (0) 2023.03.25
[백준] 벡터 매칭  (0) 2023.03.25
[백준] 양팔저울  (0) 2023.03.24