본문 바로가기
코딩캠프/BOJ

[2096] 내려가기

by 코곰_ 2024. 2. 14.
// 2096 내려가기  - 못 ㅜ품
// DP, 메모리 최적화
#include <bits/stdc++.h>

using namespace std;

int n;
int DMIN[2][3] = {0, }; //
int DMAX[2][3] = {0, }; //
int A[3]; //
int a, b, c;
int minn, maxx;

// n은 90미만 정수
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    
    cin >> n; // 100,000 -> 입력이 큰데 비해 메모리는 4MB
    
    // 초기화
    for(int i=0; i<2; i++){ // 행
        for(int j=0; j<3; j++){ // 열
            DMIN[i][j] = 0;
            DMAX[i][j] = 0;
        }
    }
    
    for(int i=0; i<n; i++){
        cin >> a >> b >> c;
        A[0] = a;
        A[1] = b;
        A[2] = c;
        
        DMIN[i%2][0] = min(DMIN[(i+1)%2][0], DMIN[(i+1)%2][1]) + A[0];
        DMIN[i%2][1] = min(min(DMIN[(i+1)%2][0], DMIN[(i+1)%2][1]), DMIN[(i+1)%2][2]) + A[1];
        DMIN[i%2][2] = min(DMIN[(i+1)%2][1], DMIN[(i+1)%2][2]) + A[2];
        
        DMAX[i%2][0] = max(DMAX[(i+1)%2][0], DMAX[(i+1)%2][1]) + A[0];
        DMAX[i%2][1] = max(max(DMAX[(i+1)%2][0], DMAX[(i+1)%2][1]), DMAX[(i+1)%2][2]) + A[1];
        DMAX[i%2][2] = max(DMAX[(i+1)%2][1], DMAX[(i+1)%2][2]) + A[2];
    }
    
    maxx = max(max(DMAX[(n-1)%2][0], DMAX[(n-1)%2][1]), DMAX[(n-1)%2][2]);
    minn = min(min(DMIN[(n-1)%2][0], DMIN[(n-1)%2][1]), DMIN[(n-1)%2][2]);
    cout << maxx << " " << minn;
    
    return 0;
}

'코딩캠프 > BOJ' 카테고리의 다른 글

[1717] 집합의 표현  (0) 2024.02.19
[2042] 구간 합 구하기  (1) 2024.02.15
[1991] 트리순회  (0) 2024.02.14
[1927] 최소힙  (1) 2024.02.14
[2748] 피보나치수2  (2) 2024.02.14