정화 코딩

[C++] 내려가기 (백준 2096번) 본문

PS

[C++] 내려가기 (백준 2096번)

jungh150c 2024. 11. 25. 03:12

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

 

#include <iostream>
#include <vector>
using namespace std;

int const INTMAX = 1000000000;
int const MAX_N = 100000;
int m[MAX_N][3];
int dpmax[2][3];
int dpmin[2][3];

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n;
    cin >> n;

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < 3; j++) {
            cin >> m[i][j];
        }
    }

    for (int j = 0; j < 3; j++) {
        dpmax[0][j] = m[0][j];
        dpmin[0][j] = m[0][j];
    }

    for (int i = 1; i < n; i++) {
        dpmax[1][0] = max(dpmax[0][0], dpmax[0][1]) + m[i][0];
        dpmax[1][1] = max(max(dpmax[0][0], dpmax[0][1]), dpmax[0][2]) + m[i][1];
        dpmax[1][2] = max(dpmax[0][1], dpmax[0][2]) + m[i][2];

        dpmin[1][0] = min(dpmin[0][0], dpmin[0][1]) + m[i][0];
        dpmin[1][1] = min(min(dpmin[0][0], dpmin[0][1]), dpmin[0][2]) + m[i][1];
        dpmin[1][2] = min(dpmin[0][1], dpmin[0][2]) + m[i][2];

        for (int j = 0; j < 3; j++) {
            dpmax[0][j] = dpmax[1][j];
            dpmin[0][j] = dpmin[1][j];
        }
    }

    cout << max(max(dpmax[0][0], dpmax[0][1]), dpmax[0][2]) << ' ';
    cout << min(min(dpmin[0][0], dpmin[0][1]), dpmin[0][2]) << '\n';
}

처음에는 dp 배열을 n * 3으로 선언했었는데 메모리 초과가 났었다. (MLE) 생각해보니 dp 배열에서 모든 정보가 필요한 게 아니라 바로 직전의 정보만 필요하기 때문에 dp 배열의 크기를 확 줄일 수 있다. (직전 정보와 현재 정보만 저장하도록) 그렇게 하면 메모리 초과를 해결할 수 있다. (AC)

그리고 min, max로 비교할 수 있는 수가 2개라는 걸 처음 알았다..! 3개 이상의 수를 비교하려면 중첩해서 사용하면 된다. 

 

'PS' 카테고리의 다른 글

[C++] A → B (백준 16953번)  (0) 2024.11.27
[C++] 벽 부수고 이동하기  (0) 2024.11.26
[C++] 알파벳 (백준 1987번)  (0) 2024.11.24
[C++] 별 찍기 - 11 (백준 2448번)  (0) 2024.11.23
[C++] 특정한 최단 경로 (백준 1504번)  (0) 2024.11.21
Comments