문제링크
https://www.acmicpc.net/problem/11052
11052번: 카드 구매하기
첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)
www.acmicpc.net
https://www.acmicpc.net/problem/16194
16194번: 카드 구매하기 2
첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)
www.acmicpc.net
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import sys
import math
input = sys.stdin.readline
n = int(input())
d = list(map(int, input().split()))
for i in range(n):
for k in range(math.ceil(i/2)):
tmp = d[k]+d[i-k-1]
if tmp>d[i]:
d[i]=tmp
print(d[n-1])
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import sys
import math
input = sys.stdin.readline
n = int(input())
d = list(map(int, input().split()))
for i in range(n):
for k in range(math.ceil(i/2)):
tmp = d[k]+d[i-k-1]
if tmp<d[i]:
d[i]=tmp
print(d[n-1])
|
cs |
POINT
- DP로 접근 가능
- 카드구매하기 풀이방법:
n번째 할 수 있는 행동 = +1, +2, ..., +n 개 포함한 카드팩 선택하기
'd[i] = i개 카드를 구매 시 최대 비용' 이라고 정의한다.
d[n]을 구하기 위해서, 후보군 : (d[n-1] + d[1]) , (d[n-2] + d[2]) , (d[n-3] + d[3]) , ... , (d[n]) 값을 전부 구한 뒤,
제일 큰 값으로 d[n]을 갱신한다. 이때, d[n-1]까지 최대값이 다 저장되어있기 때문에 DP 방식으로 접근 가능한 것이다.
* 코드에서는 list d의 index를 0부터 시작하여 이 점을 고려해주어야한다.
또한, d[2]+d[3] = d[3]+d[2] 이므로 i/2 까지만 for문을 돌려서 후보군을 생성해준다.
* 카드구매하기2 의 경우,
'd[i] = i개 카드를 구매 시 최소 비용' 이라고 정의한다. -> 카드구매하기 코드에서 부등호만 반대로 바꿔주면 풀이 완료!
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준]10844 쉬운 계단 파이썬 python (0) | 2022.02.08 |
---|---|
[백준]15990 1, 2, 3더하기 5 파이썬 python (0) | 2022.02.07 |
[백준]9095 1, 2, 3 더하기 파이썬 python (0) | 2022.02.05 |
[백준]11727 2*n타일링2 파이썬 python (0) | 2022.02.04 |
[백준]11726 2*n 타일링 파이썬 python (0) | 2022.01.16 |