전체 방문자
오늘
어제
모달조아
Better than yesterday
모달조아
  • 분류 전체보기 (147)
    • PS (86)
      • BOJ (79)
      • 프로그래머스 (6)
    • 이론 (41)
      • 자료구조 (2)
      • 알고리즘 (8)
      • 데이터베이스 (1)
      • 운영체제 (1)
      • 네트워크 (3)
      • 디자인패턴 (7)
      • Java (13)
      • Spring (4)
      • JPA (1)
      • Git (1)
    • 개발 (18)
    • 프로젝트 (1)
    • 기록 (0)
      • 후기 (0)
    • etc (1)

최근 글

티스토리

hELLO · Designed By 정상우.
모달조아

Better than yesterday

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];
}
저작자표시 (새창열림)

'PS > BOJ' 카테고리의 다른 글

BOJ 10825 국영수 [Java]  (0) 2021.07.15
BOJ 10814 나이순 정렬  (0) 2021.07.14
BOJ 2011 암호코드  (0) 2021.07.12
BOJ 2225 합분해  (0) 2021.07.09
BOJ 9461 파도반 수열  (0) 2021.07.09
    'PS/BOJ' 카테고리의 다른 글
    • BOJ 10825 국영수 [Java]
    • BOJ 10814 나이순 정렬
    • BOJ 2011 암호코드
    • BOJ 2225 합분해
    모달조아
    모달조아

    티스토리툴바