Back to posts
1 min read

백준 2096번 내려가기

On this page

백준 2096번: 내려가기

아이디어

dp테이블에 현재 위치의 숫자 + 이전에 고를 수 있던 숫자들중 가장 큰(작은) 값을 저장한다.

코드

#include <bits/stdc++.h>

using namespace std;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin >> n;
    short arr[n+1][3] = {};
    int dp[n+1][3] = {};

    for (int i = 1; i <= n; i++) {
        cin >> arr[i][0] >> arr[i][1] >> arr[i][2];
        dp[i][0] = max(dp[i-1][0], dp[i-1][1]) + arr[i][0];
        dp[i][1] = max(max(dp[i-1][0], dp[i-1][1]), dp[i-1][2]) + arr[i][1];
        dp[i][2] = max(dp[i-1][1], dp[i-1][2]) + arr[i][2];
    }

    int max_ans = 0;
    for (int i = 0; i < 3; i++) {
        max_ans = max(max_ans, dp[n][i]);
    }


    fill(&dp[1][0], &dp[n][2]+1, INT_MAX);
    for (int i = 1; i <= n; i++) {
        dp[i][0] = min(dp[i-1][0], dp[i-1][1]) + arr[i][0];
        dp[i][1] = min(min(dp[i-1][0], dp[i-1][1]), dp[i-1][2]) + arr[i][1];
        dp[i][2] = min(dp[i-1][1], dp[i-1][2]) + arr[i][2];
    }

    int min_ans = INT_MAX;
    for (int i = 0; i < 3; i++) {
        min_ans = min(min_ans, dp[n][i]);
    }

    cout << max_ans << ' ' << min_ans;
    return 0;
}

백준 2096번 내려가기-1-a7ab9d0770.png

여담

메모리 제한이 4MB다. dp테이블을 재활용했고 입력받는 숫자는 short로 받았다. 아슬아슬하게 통과함.