Baekjoon
[#11052] 카드 구매하기
강람이
2020. 3. 13. 21:09
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
32
33
34
35
36
37
38
39
40
41
|
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> price(n + 1);
vector<int> dp(n + 1, 0); //dp[i]: n이 i일때 지불해야 하는 최대값
for (int i = 1; i <= n; i++) {
cin >> price[i];
}
/*
dp[n] = max(dp[1]+dp[n-1], dp[2]+dp[n-2], ... , dp[n-1]+dp[1], Pn)
여기서 n/2를 기준으로 같은 값이 2번씩 비교되므로
dp[n] = max(dp[1]+dp[n-1], dp[2]+dp[n-2], ... , dp[n/2]+dp[n-n/2], Pn)
*/
dp[1] = price[1];
int maxVal;
for (int i = 2; i <= n; i++) {
maxVal = -1;
for (int j = 1; j <= i / 2; j++) {
if (maxVal < dp[j] + dp[i - j])
maxVal = dp[j] + dp[i - j];
}
maxVal = max(maxVal, price[i]);
dp[i] = maxVal;
}
cout << maxVal;
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
처음에는 1장당 가격이 비싼 카드팩부터 사는 그리디를 생각했었는데
n=3일때 P1 = 1, P2 = 100, P3 = 160, P4 =1
이라고 하면 1장당 가격은 P3, P2, P1, P4 순이므로 P3를 하나(1개만 더 사야됨), P1을 하나 총 161를 낸다.
하지만 P2를 두개 사면 200을 내야하고 최적해를 찾지 못한다.
dp 점화식을 생가해보면
n=1, dp[1] = P1
n=2, dp[2] = max(dp[1]+dp[1], P2)
n=3, dp[3] = max(dp[1]+dp[2], dp[2]+dp[1], P3)
n=4, dp[4] = max(dp[1]+dp[3], dp[2]+dp[2], dp[3]+dp[1], P4)
...
n=n, dp[n] = max(dp[1]+dp[n-1], dp[2]+dp[n-2], ... , dp[n-2]+dp[2], dp[n-1]+dp[1], Pn)
이 때, 같은 색끼리 중복됨 (n/2를 기준으로 같은 값이 2번씩 비교됨)
따라서 dp[n] = max(dp[1]+dp[n-1], dp[2]+dp[n-2], ... , dp[n/2]+dp[n-n/2], Pn)