BOJ

백준 9465 - 스티커

yanJuicy 2019. 5. 14. 22:27
반응형

문제

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

 

9465번: 스티커

문제 상근이의 여동생 상냥이는 문방구에서 스티커 2n개를 구매했다. 스티커는 그림 (a)와 같이 2행 n열로 배치되어 있다. 상냥이는 스티커를 이용해 책상을 꾸미려고 한다. 상냥이가 구매한 스티커의 품질은 매우 좋지 않다. 스티커 한 장을 떼면, 그 스티커와 변을 공유하는 스티커는 모두 찢어져서 사용할 수 없게 된다. 즉, 뗀 스티커의 왼쪽, 오른쪽, 위, 아래에 있는 스티커는 사용할 수 없게 된다. 모든 스티커를 붙일 수 없게된 상냥이는 각 스티커에 점

www.acmicpc.net

 

풀이

첫 번째 열에서 스티커를 떼지 않으면 두 번째 열에서 가능한 선택은 세가지다. 위 스티커를 떼거나 아래 스티커를 떼거나 스티커를 떼지 않는 경우가 된다. 첫 번째 열에서 위쪽 스티커를 떼면 두 번째 열은 아래쪽 스티커 또는 아무것도 떼지 않을 수 있다. 반대로 첫 번째 열에서 아래쪽 스티커를 떼면 두 번째 열은 위쪽 스티커 또는 아무것도 떼지 않을 수 있다.

 

이 특성을 이용해 status 변수를 사용해 상태를 나타낸다. 0이면 왼쪽 열에서 아무것도 떼지 않은 경우, 1인 경우 왼쪽 열의 위 스티커를 뗀 경우, 2인 경우 왼쪽 열에서 아래 스티커를 뗀 경우다. 이 세가지 경우 중 최대가 되는 경우를 답으로 선택하면 된다.

 

sticker(c, status)이 있을 때, c는 스티커 중 c번 열부터만 스티커를 떼어내서 얻을 수 있는 최대 가치를 구하는 거다.

 

코드

탑다운 방식

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
42
43
44
45
46
47
48
#include <iostream>
#include <algorithm>
using namespace std;
 
const int MAX = 100000;
 
int N;
int dp[MAX][3];
int score[2][MAX];
 
int sticker(int c, int status)
{
    if (c == N) return 0;
    if (dp[c][status] != -1return dp[c][status];
 
    int result = sticker(c + 10);
    if (status != 1) result = max(result, sticker(c + 11+ score[0][c]);
    if (status != 2) result = max(result, sticker(c + 12+ score[1][c]);
 
    dp[c][status] = result;
    return result;
}
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    int n;
    cin >> n;
 
    for (int i = 0; i < n; i++)
    {
        cin >> N;
 
        for (int j = 0; j < 2; j++)
            for (int k = 0; k < N; k++)
                cin >> score[j][k];
 
        for (int j = 0; j < N; j++)
            for (int k = 0; k < 3; k++)
                dp[j][k] = -1;
        
        cout << sticker(00<< '\n';
    }
 
    return 0;
}
cs

 

바텀업 방식

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 <algorithm>;
 
using namespace std;
 
int dp[100001][3];
int score[2][100001];
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    int n;
    cin >> n;
 
    for (int k = 0; k < n; k++)
    {
        int N;
        cin >> N;
        
        for (int i = 0; i < 100001; i++)
            for (int j = 0; j < 3; j++)
                dp[i][j] = 0;
 
        for (int i = 0; i < 2; i++)
            for (int j = 0; j < N; j++)
                cin >> score[i][j];
 
        for (int i = 0; i < N; i++)
        {
            dp[i + 1][0= max(dp[i + 1][0], max(dp[i][0], max(dp[i][1], dp[i][2])));
            dp[i + 1][1= max(dp[i + 1][1], max(dp[i][0], dp[i][2]) + score[0][i]);
            dp[i + 1][2= max(dp[i + 1][2], max(dp[i][0], dp[i][1]) + score[1][i]);
        }
 
        cout << max(dp[N][0], max(dp[N][1], dp[N][2])) << '\n';
    }
 
    return 0;
}
cs

점수의 최소값이 0이므로 0으로 초기화 해준다.

 

반응형

'BOJ' 카테고리의 다른 글

백준 1012 - 유기농 배추  (0) 2019.05.18
백준 1629 - 곱셈  (0) 2019.05.16
백준 10448 - 유레카 이론  (0) 2019.05.14
백준 1463 - 1로 만들기  (0) 2019.05.12
백준 3085 - 사탕 게임  (0) 2019.05.12