Game Develop

[Algorithm]Baekjoon 11052 : 카드 구매하기 본문

Algorithm/Baekjoon

[Algorithm]Baekjoon 11052 : 카드 구매하기

MaxLevel 2023. 10. 17. 10:32

https://www.acmicpc.net/problem/11052

 

11052번: 카드 구매하기

첫째 줄에 민규가 구매하려고 하는 카드의 개수 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
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int n;
int moneys[1001= { 0 };
int dp[1001= { 0 };
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    cin >> n;
 
    for (int i = 1; i <= n; ++i)
    {
        cin >> moneys[i];
    }
 
    for (int i = 1; i <= n; ++i)
    {
        dp[i] = moneys[i];
        for (int j = 1; j <= i / 2; ++j)
        {
            dp[i] = max(dp[i], dp[j] + dp[i - j]);
        }
    }
    
    cout << dp[n];
}
 
cs

 

n개의 카드를 샀을때의 최대값을 구하는 문제.

n을 4로 예시를 들면 아래와 같다.

 

1개의 카드를 사기위한 최댓값 + n-1개 카드를 사기위한 최댓값

2개의 카드를 사기위한 최댓값 + n-2개 카드를 사기위한 최댓값

3개의 카드를 사기위한 최댓값 + n-3개 카드를 사기위한 최댓값

.

.

 

n개의 카드를 사기위한 최댓값 + n-n개 카드를 사기위한 최댓값 

 

즉, dp[i]는  i개카드를 사기위한 최댓값으로 정의된다.

기본적으로 i개 카드를 사기위한 값은 주어지니 해당값으로 dp를 초기화해준다.

이후 언급한대로 dp식을 만들면 되는데, 이때 사실 n개까지 반복할 필요가 없다.

어차피 dp[1] + dp[3]이나 dp[3] + dp[1]이나 같기때문에 절반까지만 해주면 된다.