[python/規格]11052:カード払い


質問する



に答える


すべてのパッケージの価格と比較して、最高価格=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問題ですが、見当がつかなかったので、にぶんの記事を参考にして理解しました.困難