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])
나는 내가 푼 풀이가 설명하기가 힘들다....
각 idx : 카드 개수 - 1
mdp[idx] = 카드개수가 idx+1 개 일 때 P(idx) 원의 최댓값
현재 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개의 카드만 선택하는 경우이다