[python]백준11052:카드구매하기

죽부인·2023년 3월 15일
0

📌난이도🥈

📌코드


import sys
input = sys.stdin.readline

N = int(input())
arr = list(map(int, input().split()))

mdp = [0] * (N)                                     # 각 idx별 max값만 저장하는 dp
mdp[0] = arr[0]                                     # N = 1 인 경우

for cur in range(N):                                # mdp[cur] 을 구하는 과정
    dp = [0]*N                                      # cur = idx 일 떄 range(0 , idx-1)까지 2개 이상 고르는 경우 저장하는  dp
    for idx in range(cur):
        dp[idx+1] = mdp[idx] + arr[(cur-1)-idx]     # dp[cur] 까지 2개 이상 고르는 경우
    mdp[cur] = max(arr[cur], max(dp))               # arr[cur] : 1개만 골랐을 때
print(mdp[-1])

나는 내가 푼 풀이가 설명하기가 힘들다....

mdp

각 idx : 카드 개수 - 1
mdp[idx] = 카드개수가 idx+1 개 일 때 P(idx) 원의 최댓값

dp

현재 mdp[cur] 에 위치할 때 0~cur 까지 나타내는 P원의 최댓값

cur =Idx + 1 일 때 idx 의 P 최댓값인 mdp[ idx ] 에 arr[ cur 과 idx+1의 차이 ]값을 더해주어야 한다.

( cur 까지의 dp 배열의 최댓값 ) , 과 arr[cur] 사이에서 더 큰값이 mdp[cur] 에 들어가게 된다

📌후기

풀이를 보니 얼마나 센스가 없는지 알았다 .

import sys
input = sys.stdin.readline
N = int(input())
p = [0] + list(map(int, input().split()))  # p[0] 이면 1개 의미
dp = [0]*(N+1)
dp[1] = p[1]


for i in range(2, N+1):
    for k in range(1, i+1):
        if dp[i] < dp[i-k] + p[k]:
            dp[i] = dp[i-k] + p[k]

print(dp[-1])

p 와 dp 는 개수에 따라 변하므로 모두 0 번 인덱스를 비워둔다.
점화식의 형태이지만 dp[0] 일 때는 1개의 카드만 선택하는 경우이다

profile
연습장 입니다.

0개의 댓글