[BOJ] GPS

Date:

[BOJ] GPS

Problem URL : GPS

#include <algorithm>
#include <vector>

#define MAX 201
#define INF 1e9
using namespace std;

int solution(int n, int m, vector<vector<int>> edge_list, int k, vector<int> gps_log) {
    vector<int> edge[MAX];
    vector<vector<int>> dp(k, vector<int>(n + 1, INF));
    for (int i = 0; i < m; i++) {
        int N1 = edge_list[i][0];
        int N2 = edge_list[i][1];
        edge[N1].push_back(N2);
        edge[N2].push_back(N1);
    }

    // dp[A][B] = C : A번째 경로가 B가 되었을 때, 수정해야 하는 최소 횟수
    // 시작할 때 출발점은 수정이 필요없고, 다른 거점은 불가능(INF)이다.
    dp[0][gps_log[0]] = 0;
    for (int i = 1; i < k; i++) {
        for (int Cur = 1; Cur <= n; Cur++) {
            if (dp[i - 1][Cur] == INF) continue;
            for (int j = 0; j < edge[Cur].size(); j++) {
                int next = edge[Cur][j];
                if (gps_log[i] != next) {
                    dp[i][next] = min(dp[i][next], dp[i - 1][Cur] + 1);
                } else {
                    dp[i][next] = min(dp[i][next], dp[i - 1][Cur]);
                }
            }
        }
    }

    if (dp[k - 1][gps_log[k - 1]] < INF) return dp[k - 1][gps_log[k - 1]];
    return -1;
}

Comments

처음에 어떻게 풀어야할지 모르겠어서 풀이를 찾아보았다.
dp를 이용한 것을 보고 아차 싶었다.
이 블로그 풀이의 도움을 받았다.

댓글