[ 백준 ] 4883 / 삼각 그래프

金弘均·2021년 9월 15일
0

Baekjoon Online Judge

목록 보기
130/228
post-thumbnail

# Appreciation

/*
 * Problem :: 4883 / 삼각 그래프
 *
 * Kind :: Dynamic Programming
 *
 * Insight
 * - dp[i][j] = i 번째 행, j 번째 정점으로 가는 경로중 최소 비용이라고 하자
 *   + dp[i+1][j] 를 구할 때 도움이 되는가?
 *     # YES
 *       -> DP 로 풀어야 겠다
 *          (그래프의 화살표가 나를 보고 'DP 를 이래도 안 쓸거야?' 라며 묻는 것 같다)
 *
 * Point
 * - dp[i][0] 은 dp[i-1][0], dp[i-1][1] 로 부터 화살표를 받고 있고
 *   dp[i][1] 은 dp[i][0], dp[i-1][0], dp[i-1][1], dp[i-1][2] 로 부터 화살표를 받고 있고
 *   dp[i][2] 는 dp[i][1], dp[i-1][1], dp[i-1][2] 로 부터 화살표를 받고 있다
 *   + 이를 이용해서 DP 를 돌려주자
 *
 * - 초기화를 조심하자
 *   + 정점 (0, 0) 을 지나는 경로는 존재하지 않는다
 *     # dp[0][0] = INF
 *   + 정점 (0, 1) 은 시작위치다
 *     # dp[0][1] = graph[0][1]
 *   + 정점 (0, 2) 를 지나는 경로는 하나밖에 없다
 *     # dp[0][2] = graph[0][2] + dp[0][1]
 *
 * - max(N) = 10^5, max(정점비용) = 10^3
 *   max(경로비용) = 10^8
 *   + int 써도 괜찮다
 */

# Code

//
//  BOJ
//  ver.C++
//
//  Created by GGlifer
//
//  Open Source

#include <iostream>
#include <climits>
#include <cstring>
#include <algorithm>

using namespace std;

#define endl '\n'

// Set up : Global Variables
#define INF INT_MAX

// Set up : Functions Declaration
/* None */


int main()
{
    // Set up : I/O
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // Set up : Input
    int N, tc = 0;
    while (true) {
        cin >> N;
        if (N == 0) break;

        tc++;
        int G[N][3];
        for (int i=0; i<N; i++) {
            for (int j=0; j<3; j++) {
                cin >> G[i][j];
            }
        }

        // Process
        int dp[N][3];
        memset(dp, 0, sizeof(dp));
        /* 알맞게 초기화 */
        dp[0][0] = INF; /* 정점 (0, 0) 을 지나느 경로는 없음 */
        dp[0][1] = G[0][1]; /* 정점 (0, 1) 은 시작위치 */
        dp[0][2] = G[0][2] + dp[0][1]; /* 정점 (0, 2) 를 지나느 경로는 하나밖에 없음 */

        for (int i=1; i<N; i++) {
            /* 가능한 경로(들어오는 화살표)를 다 비교하여 최소비용을 구함 */
            dp[i][0] = G[i][0] + min({dp[i-1][0], dp[i-1][1]});
            dp[i][1] = G[i][1] + min({dp[i][0], dp[i-1][0], dp[i-1][1], dp[i-1][2]});
            dp[i][2] = G[i][2] + min({dp[i][1], dp[i-1][1], dp[i-1][2]});
        }

        // Control : Output
        printf("%d. %d\n", tc, dp[N-1][1]);
    }
}

// Helper Functions
/* None */
profile
이런 미친 게임을 봤나! - 옥냥이

0개의 댓글