[BOJ]11052_카드구매하기
import sys
input = sys.stdin.readline
n = int(input())
p = [0]+list(map(int, input().split()))
# max_prices = p 하면, 복사가 아니라 참조가 되어
# 한 곳을 변경하면 다른 곳도 똑같이 변경된다.
# (이 코드에서는 참조로 해도 이상은 없음.)
max_prices = p[:]
for i in range(2, n + 1):
for j in range(1, i // 2 + 1):
if max_prices[i] < max_prices[i - j] + max_prices[j]:
max_prices[i] = max_prices[i - j] + max_prices[j]
print(max_prices[n])
풀이
동적 프로그래밍 문제를 풀 때는 우선 기본 점화 관계를 밝힌 뒤에, 보다 효율성을 높일 수 있는 방안을 생각하도록 해야겠다.
카드 n장을 한번에 구매하는 가격이 price(n)이고,
카드 n장을 구매할 때의 최대 금액을 max_price(n)이라고 하자.
그렇다면 max_price(n)은
price(n)
max_price(n - 1) + max_price(1)
max_price(n - 2) + max_price(2)
...
max_price(n - k) + max_price(k) 중 가장 큰 값과 같다.
Author And Source
이 문제에 관하여([BOJ]11052_카드구매하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@zioo/BOJ11052카드구매하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)