코딩고치

[백준][DP] 카드 구매하기 본문

백준 알고리즘 기초/다이내믹 프로그래밍

[백준][DP] 카드 구매하기

코딩고치 2019. 9. 21. 01:46

1. 문제 주소

 

11052번: 카드 구매하기

첫째 줄에 민규가 구매하려고 하는 카드의 개수 N이 주어진다. (1 ≤ N ≤ 1,000) 둘째 줄에는 Pi가 P1부터 PN까지 순서대로 주어진다. (1 ≤ Pi ≤ 10,000)

www.acmicpc.net

2. 문제

점화식을 세우기 위해 n=2일 때부터 차례대로 구해보았다. 구매하려고 하는 카드의 개수가 4개이고 p={1, 5, 6, 7} 일 때 

n=1---p[1]

n=2---max(p[2], p[1]+p[2-1])

n=3---max(p[3], p[1]+p[3-1], p[2]+p[3-2])

n=4---max(p[4], p[1]+p[4-1], p[2]+p[4-2],p[3]+p[4-3])

과 같이 구할 수 있다.

 

3. 소스 코드

1. Bottom-up

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
#include <iostream>
#include <algorithm>
using namespace std;
int p[1001];
int dn[1001];
int main(void)
{
    int n;
    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++)
        {
            dn[i] = max(dn[i], p[j] + dn[i - j]);
        }
    }
 
    cout << dn[n] << '\n';
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 

 

2. Top-down

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
#include <iostream>
#include <algorithm>
using namespace std;
int p[1001];
int dn[1001];
 
int topdown(int n)
{
    if (n == 0)
        return 0;
    if (dn[n]) return dn[n];
 
    int result = 0;
    for (int i = 1; i <= n; i++)
    {
        result = max(result, topdown(n - i) + p[i]);
    }
    return dn[n]=result;
 
}
int main(void)
{
    int n;
    cin >> n;
 
    for (int i = 1; i <= n; i++)
    {
        cin >> p[i];
    }
 
    cout << topdown(n) << '\n';
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
 
Comments