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 |