1 분 소요

백준 (BOJ) 11052번
https://www.acmicpc.net/problem/11052

사용언어 : PYTHON

1.문제

image image

2.풀이

최적해(최댓값)을 구하는 문제이므로 다이나믹 프로그래밍을 사용하여 풀 수 있었다.

최적해의 일부분이 그 부분에 대한 최적해가 DP 순환식을 세우는 출발점임을 생각했다.

N이 4이고 P1=1, P2=5, P3=6, P4=7인 경우

최댓값 = max(P4를 선택하지 않은 경우, P4를 선택한 경우)이다.

이때 P4를 선택하면 N의 갯수를 모두 채우기 때문에 P4하나만 살 수 있다.

따라서 max{(P1,P2,P3)의 조합을 이용해서 4를 만들 수 있는 최댓값, 7}이 된다.


위 최적해의 일부분 (P1,P2,P3)의 조합을 이용해서 4를 만들 수 있는 최댓값 = (P3를 선택하지 않는 경우, P3를 최소 하나 선택한 경우)이다.

이때 P3를 최소 하나 선택한 경우 N(=4)-3 = 1 즉 P1만 살 수 있다.

따라서 max{(P1,P2)의 조합을 이용해서 4를 만들 수 있는 최댓값, 1+6}이 된다.


위 최적해의 일부분 (P1,P2)의 조합을 이용해서 4를 만들 수 있는 최댓값 = (P2를 선택하지 않는경우, P2를 최소 하나 선택한 경우)이다.

P2를 선택하지 않는경우는 P1을 4개 사는 경우밖에 없다.

P2를 최소 하나 선택한 경우 N(=4)-2 = 2 즉 (P1,P2)를 이용해서 2를 만들 수 있는 최댓값이 된다.

따라서 max{1*4, (P1,P2)를 이용해서 2를 만들 수 있는 최댓값}이 된다.


위 최적해의 일부분 (P1,P2)의 조합을 이용해서 2를 만들 수 있는 최댓값 = (P2를 선택하지 않은 경우, P2를 최소 하나 선택한 경우)이다.

P2를 선택하지 않은 경우는 P1을 2개사는 경우밖에 없다.

P2를 최소 하나 선택한 경우는 P2하나를 사는 경우밖에 없다.

따라서 max{1*2, 5} 가 된다.

2-1.순환식을 세우기

image
카드 갯수가 1개인 경우(i=1) p1밖에 구매할 수 없다.
주어진 카드가 하나도 없으면(j=0) 최댓값은 0이다.
주어진 카드가 1개(j=1)이면 최댓값은 P1 * i 이다.
그렇지 않은경우 위에서 예를 들어 설명한 바를 순환식으로 나타내었다.

2-2.base case로 수렴하는지 확인

j-1, i-j 를 반복하면
i=1, i=0, j=1인 base case로 수렴하게 된다.

2-3.순환식을 계산

image

bottom-up 방식(순환식의 오른쪽에 등장하는 값이 왼쪽에 등장하는 값보다 먼저 계산)으로 연산을 하려면 빨간색 화살표와 같이 행우선 순서대로 계산하면 된다.

이때 순환식에는 나타나지 않았는데 i < j 인경우 D(i,j) = D(i,i)가 된다.
예를들어 D(3,5) 즉 카드 3개를 구매하는데 P1,P2,P3,P4,P5가 있다면 P4와 P5는 3개를 초과하기 때문에 구매할 수 없고 P1,P2,P3만 구매할 수 있기 때문이다.

3.코드

import sys
input = sys.stdin.readline

N=int(input())
P=list(map(int,input().split()))
P.insert(0,0)

l=[[0]*(N+1) for _ in range(N+1)]

for j in range(1,N+1):
    l[1][j]=P[1]

for i in range(1,N+1):
    l[i][1] = P[1]*i


for i in range(2,N+1):
    for j in range(2,N+1):
        if i < j:
            l[i][j]=l[i][i]
        else:
            l[i][j] = max(l[i][j-1],l[i-j][j] + P[j])

print(l[N][N])

댓글남기기