PS

BOJ 1516 : 게임 개발

lickelon 2025. 2. 12. 23:08
  • 문제 링크 : boj.kr/1516
  • 난이도 : G3
  • 태그 : DP

코드

#include <bits/stdc++.h>

#define all(x) (x).begin(), (x).end()

#define INF 0x7FFFFFFF

using namespace std;

using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    int n;
    cin >> n;
    vector<pair<int, vector<int>>> arr(n);
    for(auto &e : arr) {
        cin >> e.first;
        while(true) {
            int input;
            cin >> input;
            if(input == -1) break;
            e.second.emplace_back(input-1);
        }
    }

    vector<int> dp(n, 0);

    function<int(int)> func = [&](int k) -> int{
        if(dp[k]) return dp[k];
        dp[k] = 0;
        for(auto e : arr[k].second) {
            dp[k] = max(dp[k], func(e));
        }
        dp[k] += arr[k].first;
        return dp[k];
    };

    for(int i = 0; i < n; i++) {
        cout << func(i) << "\n";
    }

    return 0;
}

풀이

k를 짓기 이전에 지어야 하는 건물들의 배열을 $P_k$, k를 짓는 데에 걸리는 시간을 $T_k$라고 하자.

$dp[k] = max(dp[P_k [0]], dp[P_k [1]] , \cdots ,  dp[P_k [j]] ) + T_k $이다.

모든 건물을 짓는 것이 가능하다고 했으므로 재귀 DP를 이용하면 답을 구할 수 있다.

728x90

'PS' 카테고리의 다른 글

BOJ 7585 : Brackets  (0) 2025.02.14
BOJ 20118 : 호반우가 길을 건너간 이유  (0) 2025.02.13
BOJ 11645 : I’ve Been Everywhere, Man  (0) 2025.02.11
BOJ 11008 : 복붙의 달인  (0) 2025.02.10
BOJ 29719 : 브실이의 불침번 근무  (0) 2025.02.09