baekjoon
[백준/BOJ] 11052번 카드 구매하기 (Python)
riley_dev
2021. 2. 25. 16:29
[백준/BOJ] 11052번 카드 구매하기
11052번: 카드 구매하기
첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)
www.acmicpc.net
문제를 처음 읽고, 처음에는 백트래킹 문제인 줄 알았다. n을 만드는 수의 조합을 찾아야하나 싶었는데, 분류를 보니 dp여서 dp방식으로 풀어야한다는걸 알았다.
1개 부터 n개 까지 카드팩을 구매하는 최댓값을 구하면서 값을 올리면 되겠다고 생각했고, dp방식으로 접근하니 금방 알 수 있었다. dp가 조금씩 익숙해지는 것 같다.
알고리즘
1. n과 p를 입력받고, dp를 n+1의 크기로 만들어준다
2. i는 1부터 n+1까지, j는 1부터 i+1까지 이중으로 반복문을 돌면서 dp[i]의 값과 dp[i-j]+dp[j]의 값 중 큰 값을 dp[i]에 넣어준다.
3. dp[n]을 출력한다.
Python code
더보기
n=int(input())
p=[0]+list(map(int, input().split()))
dp=[0]*(n+1)
for i in range(1, n+1):
for j in range(1, i+1):
dp[i]=max(dp[i],dp[i-j]+p[j])
print(dp[n])