백준 온라인 저지

백준 9465: 스티커

dev_doyle 2018. 7. 9. 14:41

다이나믹 프로그래밍을 이용하는 문제. 스티커를 뜯지 않았을 때, 위쪽을 뜯었을 때, 아래쪽을 뜯었을 때의 경우를 나누고 각 경우에 따라 이전의 스티커 상태와의 관계를 점화식으로 세운 후 코딩하면 된다. 마지막 출력에서 endl을 쓰지 않아서 답 찾느라고 고생했다.. 후 

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
#include <iostream>
#include <algorithm>
using namespace std;
long long d[100100][3];
long long point[1000100][2];
 
int main()
{
    int init_input = 0;
    cin >> init_input;
    //주어진 T케이스 만큼 값을 구한다.
    while (init_input--)
    {
        int line = 0;
        cin >> line;
        //point 배열에 주어진 값 넣기
        for (int j = 0; j < 2++j)
        {
            for (int k = 1; k <= line; ++k)
                cin >> point[k][j];
        }
        //d[i][0] 안뜯었을 때의 값 d[i][1] 아래 스티커 뜯었을 때의 값 d[i][2] 위 스티커 뜯었을 때의 값
        d[0][0= 0;
        d[0][1= 0;
        d[0][2= 0;
        for (int j = 1; j <= line; ++j)
        {
            d[j][0= max(d[j - 1][0], max(d[j - 1][1], d[j - 1][2]));
            d[j][1= max(d[j - 1][0], d[j - 1][2]) + point[j][0];
            d[j][2= max(d[j - 1][0], d[j - 1][1]) + point[j][1];
        }
        long long ans = 0;
        for (int l = 1; l <= line; l++) {
            ans = max(max(ans, d[l][0]), max(d[l][1], d[l][2]));
        }
        cout << ans << endl; //출력을 잘보자..
    }
    return 0;
}
cs