PS/BOJ

BOJ 11052 카드 구매하기

모달조아 2021. 7. 12. 08:52

boj 11052 카드 구매하기

- 문제 링크

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

- 문제 해설

DP가 작은 문제부터 쌓아나가서 구하고자 하는 값을 구하는 알고리즘임을 생각하면 쉽게 접근 방법을 찾을 수 있다. 나는 보통 DP로 문제를 풀 때 D[i]를 어떻게 나눌지를 생각하는 편이다.

D[i]를 i개의 카드를 사는 금액의 최댓값이라고 지정하자. 그러면 아래와 같이 쪼갤 수 있다.

  • D[i-1] + P[1] : 카드 1개가 들어있는 팩의 구매 값 + i-1개의 카드를 구매한 최댓값
  • D[i-2] + P[2] : 카드 2개가 들어있는 팩의 구매 값 + i-2개의 카드를 구매한 최댓값
    .
    .
    .
  • D[0] + P[i] : 카드 i개가 들어있는 팩의 구매 값 + 0개의 카드를 구매한 최댓값

이것들을 전부 비교해서 그 중 최댓값이 D[i]가 된다.
즉, 점화식은 D[i] = max(D[i], D[i-j] + P[j]) (1<=j<=i) 이다.

- 코드 보기

#include <iostream>
#include <algorithm>
using namespace std;

int n;
int P[1005];
int D[1005];

int main(void)
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> P[i];

    D[1] = P[1];

    for (int i = 2; i <= n; i++)
    {    
        for (int j = 1; j <= i; j++)
        {
            D[i] = max(D[i], D[i - j] + P[j]);
        }
    }

    cout << D[n];
}