쾌락없는 책임 (공부)/알고리즘 문제풀이

[Algorithm] 백준 2096 내려가기 - C++, DP, DFS

허스크 2022. 2. 26. 17:08
반응형
 

2096번: 내려가기

첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다.

www.acmicpc.net

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

int n;
int map[100001][4];
int maxVal[3][4];
int minVal[3][4];

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

    // input
    cin >> n;
    for(int i = 0; i < n; i++)
        cin >> map[i][0] >> map[i][1] >> map[i][2];
    
    // solve
    maxVal[0][0] = minVal[0][0] = map[0][0];
    maxVal[0][1] = minVal[0][1] = map[0][1];
    maxVal[0][2] = minVal[0][2] = map[0][2];


    for(int i = 1; i < n; i++){
        int left = map[i][0];
        int mid = map[i][1];
        int right = map[i][2];

        maxVal[1][0] = left + max(maxVal[0][0], maxVal[0][1]);
        maxVal[1][1] = mid + max(maxVal[0][0], max(maxVal[0][1], maxVal[0][2]));
        maxVal[1][2] = right + max(maxVal[0][1], maxVal[0][2]);

        minVal[1][0] = left + min(minVal[0][0], minVal[0][1]);
        minVal[1][1] = mid + min(minVal[0][0], min(minVal[0][1], minVal[0][2]));
        minVal[1][2] = right + min(minVal[0][1], minVal[0][2]);

        maxVal[0][0] = maxVal[1][0];
        maxVal[0][1] = maxVal[1][1];
        maxVal[0][2] = maxVal[1][2];

        minVal[0][0] = minVal[1][0];
        minVal[0][1] = minVal[1][1];
        minVal[0][2] = minVal[1][2];

    }

    int totalMax = max(maxVal[0][0], max(maxVal[0][1], maxVal[0][2]));
    int totalMin = min(minVal[0][0], min(minVal[0][1], minVal[0][2]));
    cout << totalMax << " " << totalMin << '\n';
}

 DP 문제를 구하다가 우연히 만난 복병. 문제는 메모리로 C++에서 주어지는 메모리가 상당히 작았습니다. 그래서 처음에는 배열을 입력만큼 2개 더 선언했다가 그대로 메모리 초과가 나왔습니다.

 여러 방법을 찾아봤는데 위와 같은 방법으로 해야 DP + DFS로 출이가 되었습니다. dp 없이 변수 6개로 해보려다가 틀렸습니다 많이 맞아버렸네요.

 

 

반응형