Thief of Wealth
Published 2020. 9. 28. 00:27
11052 카드 구매하기 개발/알고리즘

www.acmicpc.net/problem/11052

 

11052번: 카드 구매하기

첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)

www.acmicpc.net

 

아주 단순한 dp문제이다. 하지만 기억이 나지 않는다면 틀릴 수 밖에 없다.

dp[i]를 i개의 카드를 구매할 때 지불할 수 있는 최대 비용이라고 정의한다면

 

1인경우에는

1 뿐이므로 dp[1] = cardPack[1] 일 것이고

 

2인경우에는

1+1, 2

3인 경우에는

1+1+1, 2+1, 3

4인 경우에는

1+1+1+1, 2+1+1, 2+2, 3+1, 4

5인 경우에는

1+1+1+1+1, 2+1+1+1, 2+2+1, 2+3, 3+1+1, 3+2, 4+1, 5

 

의 경우의 수가 있다.

 

이런 규칙의 점화식은 

cardPack[i]과 dp[i-j]+cardPack[j], dp[i] 이렇게 3가지를 비교하여 최대값을 넣어주는 점화식으로 풀 수 있다.

 

이런 유형이 많은 편이므로 외워두는 것이 좋다고 생각한다. 점화식을 세울 수 있는 사고력이면 더 좋다.

 

즉 N개의 카드팩을 1개 고르거나, j개가 들어있는 카드팩을 고르기전 최대값을 고르는 문제로 세분화한다는 아이디어가 필요하다.

 


import sys
input = sys.stdin.readline

n = int(input())

cardPack = dict()
for i,v in enumerate(map(int, input().rstrip().split(" "))):
  cardPack[i+1] = v

# dp[i]는 i개의 카드를 산다했을때 가장 많이 지불할 수 있는 가격
dp = [0] * (n+1)


dp[1] = cardPack[1]

for i in range(1, n+1):
  for j in range(i,0,-1):
    dp[i] = max([ dp[i], cardPack[i], dp[i-j] + cardPack[j] ])

print(dp[n])

'개발 > 알고리즘' 카테고리의 다른 글

11403 경로 찾기  (0) 2020.09.28
플로이드 워셜 알고리즘  (0) 2020.09.28
14501 퇴사  (0) 2020.09.26
11727 2xn 타일링 2  (0) 2020.09.25
1261 알고스팟  (0) 2020.09.24
profile on loading

Loading...