# [BOJ] 11985 오렌지 출하 - python

문제 링크 (opens new window)

# 문제 요약

주어진 조건을 만족하면서, 모든 오렌지를 포장하는 최소 비용을 구해라

# 문제 접근

DP[i] : i 번째 오렌지까지 포장했을때 최소 비용

i 번째 오렌지를 포함하는 현재 박스의 사이즈를 siz 라고 할때,

cost1 = (siz=1일때 박스 비용 + dp[i-1]),

cost2 = (siz=2 일때 박스 비용 + dp[i-2]),

...

costM = (siz=M 일때 박스 비용 + dp[i-M])

즉 DP[i] = (cost1~costM 중에 최솟값) 이라는 공식을 도출할수있다.

# 소스코드

PyPy3 로 제출했습니다.

import sys
input = sys.stdin.readline

N, M, K = map(int, input().split())
MAX_A = 1000000000

# 1 <= i <= N
A = [0]+[int(input()) for _ in range(N)]

# dp[i] : i 번째 오렌지까지 포장했을때 최소 비용
dp = [0]*(N+1)
dp[1] = K

for i in range(2, N+1):
    min_v = max_v = A[i]
    
    dp[i] = dp[i-1]+K
    for siz in range(2, min(M, i)+1):
        # j: 포장하는 box 의 가장 왼쪽 오렌지 
        j = i - siz + 1 

        min_v, max_v = min(min_v, A[j]), max(max_v, A[j])
        
        box_cost = K+siz*(max_v-min_v)
        
        dp[i] = min(dp[i], dp[j-1]+box_cost)

print(dp[N])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28