일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- permutation
- Combination
- 11057
- 홈화면
- itertools
- Python
- 코틀린
- 11053
- 6603
- 파이썬
- 코테
- 백준
- 뒤로가기
- LCS
- 최소공배수
- 11054
- 괄호
- expo
- lcm
- 1182
- 9095
- 매일11시
- 안드로이드
- 순열
- 1260
- 앱
- Kotlin
- Android
- 11기
- 나머지
Archives
- Today
- Total
황소개발자
백준 11052 파이썬 python 카드 구매하기 @@ 황소처럼 우직하게 본문
반응형
n = int(input())
dp = [0 for i in range(n + 1)]
p = list(map(int, input().split()))
for i in range(1, n+1):
cost = 0
for j in range(1, i):
sum = dp[j] * (i // j)
if i % j != 0:
sum += dp[i - j*(i//j)]
if sum > cost:
cost = sum
if cost > p[i - 1]:
dp[i] = cost
else:
dp[i] = p[i - 1]
print(dp[n])
자 이것도 다이나믹 하게 풀어야합니다.
다이나믹하게 풀 수 있도록 dp 배열을 만들고요.
n이 주어졌을때,
1개만 사야한다 했을 때, max값은?
2개만 사야한다 했을 때, max값은?
...
n개만 사야한다 했을 때, max값은?
이런식으로 순서대로 dp 배열에 쌓아나갑니다. 그리고 마지막에 dp[n] 을 뱉으면 되겠죠
이제 문제는
각 개수에서 max값을 어떻게 선정할지입니다.
자 간단합니다. 5개를 사야한다 했을 때 max값 구하는 과정 보겠습니다.
dp[1] * 5 , dp[2] * 2 + dp[1] , dp[3] + dp[2] , dp[4] + dp[1] , p[4]
(지금 dp는 '인덱스=수' 인 반면에 p 는 '(수-1) = 인덱스' 입니다. p는 인풋값입니다^^)
이 5개 요소중에서 max값 찾으면 됩니다.
5개를 사야한다 했을 때, 1부터 4까지 for문 돌리시는데,
각 수로 일단 dp[j] 값을 최대한 넣고 남는 수가 있다면
남는 수 = k, 만큼 dp[k] 더하시면 됩니다.
이만, hjp845 였습니다.
--
며칠뒤에 한번 더 풀어 봤는데요
깔끔하게 푼 코드는 아래글에 있습니다.
반응형
'백준 문제 풀이' 카테고리의 다른 글
백준 11051 파이썬 python 이항 계수 2 @@ 황소처럼 우직하게 @@ 나눠하면되고, 합쳐서하면 왜 틀릴까.. (0) | 2020.02.19 |
---|---|
백준 11057 오르막 수 python 파이썬 @@황소처럼우직하게 @@숏코딩 (0) | 2020.02.19 |
백준 11053 파이썬 python (0) | 2019.11.01 |
백준 11727 파이썬 python (0) | 2019.10.31 |
백준 2217 파이썬 python 로프 (0) | 2019.10.30 |
Comments