반응형
문제
https://www.acmicpc.net/problem/11052
풀이
1부터 N까지의 수 중에서 조합을 해서 N을 만드는 경우의 최대값을 구하는 문제이다.
D[N]을 N개를 갖기 위해 지불하는 최대 금액으로 한다.
N이 4라고 하고 P[1] ~ P[4]까지 카드의 금액이 주어진다고 하면
○ + ○ + ○ + ● = 4 에서
●에 올 수 있는 수는 1, 2, 3, 4 가 된다.
그럼 가능한 점화식은 다음이 된다.
D[4] = max {
D[4-1] +P[1],
D[4-2] + P[2],
D[4-3] + P[3],
D[4-4] + P[4] = D[0] + P[4]
}
이 점화식을 일반화 하여 문제를 해결한다.
D[N] = max {
D[N-1] +P[1],
D[N-2] + P[2],
D[N-3] + P[3],
......
D[N-N] + P[N]
}
코드
탑다운 방식
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
|
#include <iostream>
#include <algorithm>
using namespace std;
int N;
int P[1001];
int dp[1001];
int f(int N)
{
if (N == 0) return 0;
if (dp[N]) return dp[N];
int result = 0;
for (int i = 1; i <= N; i++)
result = max(result, f(N - i) + P[i]);
return dp[N] = result;
}
int main()
{
cin.tie(0);
ios::sync_with_stdio(false);
cin >> N;
for (int i = 1; i <= N; i++) cin >> P[i];
cout << f(N);
return 0;
}
|
cs |
바텀업 방식
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 | #include <iostream> #include <algorithm> using namespace std; int N; int P[1001]; int dp[1001]; int main() { cin.tie(0); ios::sync_with_stdio(false); cin >> N; for (int i = 1; i <= N; i++) cin >> P[i]; for (int i = 1; i <= N; i++) { for (int j = 1; j <= i; j++) { dp[i] = max(dp[i], dp[i - j] + P[j]); } } cout << dp[N]; return 0; } | cs |
반응형
'BOJ' 카테고리의 다른 글
백준 11057 - 오르막 수 (0) | 2019.07.08 |
---|---|
백준 10844 - 쉬운 계단 수 (0) | 2019.07.07 |
백준 2309 - 일곱 난쟁이 (0) | 2019.07.03 |
백준 13904 - 과제 (1) | 2019.07.02 |
백준 2212 - 센서 (1) | 2019.06.30 |