백준 2096번: 내려가기

Seungil Kim·2021년 10월 27일
0

PS

목록 보기
70/206

내려가기

백준 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;
}

여담

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

profile
블로그 옮겼어용 https://ks1ksi.io/

0개의 댓글