모든 카드팩의 가격을 비교해 최댓값을 찾아야 한다 == DP이다.
<Example>
n = 5
p = [1,4,2,7,3]
DP[A] = B
A장의 카드를 사는데 지불해야하는 최대 금액이 B원이다.
카드 1장 사는데 지불해야하는 최대 금액은 1원
DP[1] = max(P[1]) = 1
카드 2장 사는데 지불해야하는 최대 금액은 4원
DP[2] = max(P[2] , P[1] * 2) = 4
= max(2장 들어있는 카드팩 하나 사는 금액, 1장 카드팩 사는 금액 + 1장 카드 사는 최대 금액)
= max(P[2], DP[1]+P[1])
카드 3장 사는데 지불해야하는 최대 금액은
DP[3] = max(P[3], P[2]*1 + P[1], P[1]*3) = 5원
= max(3장 들어있는 카드팩 하나 사는 금액,\
2장 들어있는 카드팩 하나 사는 금액 + 1장 카드 사는 최대 금액,
1장 들어있는 카드팩 하나 사는 금액 + 2장 카드 사는 최대 금액)
= max(P[3], P[2]+DP[1], P[1]+DP[2])
카드 4장 사는데 지불해야하는 최대 금액은
DP[4] = max(P[4], P[3]*1+P[1] , P[2]*2, P[2]+P[1]*2 ) = 8원
= max(4장 들어있는 카드팩 하나 사는 금액,\
3장 들어있는 카드팩 하나 사는 금액 + 1장 카드 사는 최대 금액,\
2장 들어있는 카드팩 하나 사는 금액 + 2장 카드 사는 최대 금액,\
1장 들어있는 카드팩 하나 사는 금액 + 3장 카드 사는 최대 금액 )
= max(P[4], P[3]+DP[1], P[2]+DP[2], P[1]+DP[3])
카드 5장 사는데 지불해야하는 최대 금액은
DP[5] = max(P[5], P[4]+P[1] ,P[3]+P[2] \
,P[3]+P[1]*2, P[2]*2+P[1], P[2]+P[1]*3, P[1]*5 ) = 9원
= max(5장 들어있는 카드팩 하나 사는 금액,\
4장 들어있는 카드팩 하나 사는 금액 + 1장 카드 사는 최대 금액,\
3장 들어있는 카드팩 하나 사는 금액 + 2장 카드 사는 최대 금액,\
2장 들어있는 카드팩 하나 사는 금액 + 3장 카드 사는 최대 금액,\
1장 들어있는 카드팩 하나 사는 금액 + 4장 카드 사는 최대 금액)
------------------------------------------------
n = int(input()) # 카드의 개수
p = list(map(int, input().split())) # p
dp = [0 for _ in range(n+1)]
p = [0]+p
dp[1] = p[1]
for i in range(2,n+1):
dp[i] = p[i]
for j in range(1,i):
dp[i] = max(dp[i], p[j] + dp[i-j])
print(dp[n])
dp문제인데 갈피를 못잡아서 이분의 글을 참고해서 이해했다. 어렵다 ㅠ