기억보다는 기록을 해볼까

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

백준으로 C++ 공부하기

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

옥상에서 2022. 1. 12. 19:53
728x90

문제

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

 

2096번: 내려가기

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

www.acmicpc.net

생각

메모리 생각을 안하고 풀어서 계속 실패를 했다.

int map[2][3];
int mindp[2][3];
int maxdp[2][3];

로 설정을 한다.

코드

#include <iostream>
using namespace std;

int n;
int map[2][3];
int mindp[2][3];
int maxdp[2][3];
int minSum, maxSum;

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

    cin >> map[0][0] >> map[0][1] >> map[0][2];
    for(int i = 0; i < 3; i++) {
        mindp[0][i] = map[0][i];
        maxdp[0][i] = map[0][i];
    }
    
    for(int i = 1; i < n; i++) {
        cin >> map[1][0] >> map[1][1] >> map[1][2];
        mindp[1][0] = map[1][0] + min(mindp[0][0], mindp[0][1]);
        mindp[1][1] = map[1][1] + min(min(mindp[0][0], mindp[0][1]), mindp[0][2]);
        mindp[1][2] = map[1][2] + min(mindp[0][1], mindp[0][2]);

        maxdp[1][0] = map[1][0] + max(maxdp[0][0], maxdp[0][1]);
        maxdp[1][1] = map[1][1] + max(max(maxdp[0][0], maxdp[0][1]), maxdp[0][2]);
        maxdp[1][2] = map[1][2] + max(maxdp[0][1], maxdp[0][2]);

        for(int j = 0; j < 3; j++) {
            mindp[0][j] = mindp[1][j];
            maxdp[0][j] = maxdp[1][j];
        }
        
    }
    int maxSum = max(max(maxdp[1][0], maxdp[1][1]), maxdp[1][2]);
    int minSum = min(min(mindp[1][0], mindp[1][1]), mindp[1][2]);

    if(n == 1) {
        maxSum = max(max(maxdp[0][0], maxdp[0][1]), maxdp[0][2]);
        minSum = min(min(mindp[0][0], mindp[0][1]), mindp[0][2]);
    }
    cout << maxSum << " "<< minSum;
}
728x90
Comments