티스토리 뷰

# 출처 : https://www.acmicpc.net/problem/2579



이전 칸에서 현재 칸에 도달한 경우를 나눠 계산해 주면 된다.


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
49
50
51
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int N;
 
// 각 칸에 할당된 점수
vector<int> stairVal;
 
// 현재까지 오는데 계산된 총 점수
// 0 : 이전 칸에서 2칸 건너 현재 칸에 도달
// 1 : 이전 칸에서 1칸 건너 현재 칸에 도달
int stackedVal[300][2];        
 
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    cin >> N;
    for (int i = 0; i < N; ++i)
    {
        int num;
        cin >> num;
        stairVal.push_back(num);
    }
 
    // 초기값 셋팅
    stackedVal[0][0= stairVal[0];
    stackedVal[1][0= stairVal[1];
    stackedVal[1][1= stairVal[0+ stairVal[1];
 
    for (int i = 2; i < N; ++i)
    {
        // 2칸 건너 현재에 온 경우
        // 이 경우 이전 칸에서의 두 경우 모두 가능
        stackedVal[i][0= max({ stackedVal[i][0],
                                stackedVal[i - 2][0+ stairVal[i],
                                stackedVal[i - 2][1+ stairVal[i] });
        // 1칸 건너 현재에 온 경우
        // 이 경우 이전 칸에서 2칸 건너 그 칸에 온 경우만 가능
        // 즉, 연달아 세 칸을 밟을 수 없음
        stackedVal[i][1= max({ stackedVal[i][1],
                                stackedVal[i - 1][0+ stairVal[i] });
    }
 
    cout << (stackedVal[N - 1][0> stackedVal[N - 1][1] ? stackedVal[N - 1][0] : stackedVal[N - 1][1]) << '\n';
    return 0;
}
cs


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
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
글 보관함