본문 바로가기
Problem Solving/BOJ

[Python]16194. 카드 구매하기 2

by 부르르 2019. 4. 3.

https://www.acmicpc.net/problem/16194

 

16194번: 카드 구매하기 2

첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)

www.acmicpc.net


점화식 dp[i] 를 구하기 위해선

 

p[1] + dp[i-1]

p[2] + dp[i-2]

p[3] + dp[i-3]

...

p[j] + dp[i-j]

 

까지 구해야 하며, 주어진 문제조건에 따라 이 중 에서 가장 작은 값이 dp[i]가 된다.

 

다시 말해, dp[i] = min(p[1] + dp[i-1], p[2] + dp[i-2], p[3] + dp[i-3], ... , p[j] + dp[i-j])

 

여기서 범위는 1<=i<=n, 1<=j<=i 이므로 이중 포문을 이용한 Bottom-up으로 문제를 해결한다.

1
2
3
4
5
6
7
8
9
10
11
= int(input())
= [0]+list(map(int, input().split()))
dp = [0]*(n+1)
 
for i in range(1,n+1):
    min_val = 987654321
    for j in range(1,i+1):
        min_val = min(min_val, p[j]+dp[i-j])
    dp[i] = min_val
 
print(dp[n])
cs
728x90
반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[Python]10844. 쉬운 계단 수  (0) 2019.04.04
[Python]15990. 1,2,3 더하기 5  (2) 2019.04.03
[Python]1463. 1로 만들기  (0) 2019.04.02
[Python]3055. 탈출  (0) 2019.04.02
[Python]2206. 벽 부수고 이동하기  (0) 2019.04.02

댓글