https://www.acmicpc.net/problem/11052
11052번: 카드 구매하기
첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)
www.acmicpc.net
카드를 i개까지 살 때 각 개수의 최댓값 P_i을 알고 있다고 하자. 카드를 i + 1개 살 때 가격의 최댓값은 카드가 i + 1개 들어있는 카드팩의 가격, 혹은 1 <= k <= i인 정수 k에 대해 P_k + P_(i + 1 - k)의 최댓값이다. 이 때 k > (i / 2)인 경우 (i + 1 - k) < (i / 2)이므로, 실제로 사용되는 k의 범위는 i <= k <= (i / 2)이다.
#include <cstdio>
#define MAX_N 1000
int max(int a, int b) { return a > b ? a : b; }
int main() {
// N: 구매할 카드의 개수, P[i]: 카드를 i장 구매할 때의 가격의 최댓값
int N, P[MAX_N + 1] = { 0, };
// 구매할 카드의 개수를 입력받은 뒤
scanf("%d", &N);
// 각 카드의 개수에 대해
for (int n = 1; n <= N; n++) {
// 카드가 n개 들어있는 카드팩의 가격을 입력받은 뒤
scanf("%d", P + n);
// 카드가 i개와 n - i개 들어있는 카드팩을 각각 구매할 때의 가격과 비교해
// 더 큰 값으로 갱신
for (int i = 1; i <= n / 2; i++) P[n] = max(P[n], P[i] + P[n - i]);
}
// 카드를 N개 구매할 때의 가격의 최댓값을 출력
printf("%d\n", P[N]);
return 0;
}
'알고리즘 > 문제 풀이' 카테고리의 다른 글
11054번: 가장 긴 바이토닉 부분 수열 (0) | 2022.01.04 |
---|---|
11053번: 가장 긴 증가하는 부분 수열 (0) | 2022.01.04 |
11051번: 이항 계수 2 (0) | 2022.01.04 |
11050번: 이항 계수 1 (0) | 2022.01.04 |
11047번: 동전 0 (0) | 2022.01.04 |