BAEKJOON

BAEKJOON 1005번: ACM Craft

杉山空 2022. 3. 1. 22:13
728x90

https://www.acmicpc.net/problem/1005

 

1005번: ACM Craft

첫째 줄에는 테스트케이스의 개수 T가 주어진다. 각 테스트 케이스는 다음과 같이 주어진다. 첫째 줄에 건물의 개수 N과 건물간의 건설순서 규칙의 총 개수 K이 주어진다. (건물의 번호는 1번부

www.acmicpc.net

풀이

D[i]={i번째 건물을 짓는데 걸리는 총 시간}

D를 위와 같이 정의 하면, 마지막으로 짓고 싶은 건물 W에서 시작하여 각 건물에 대해 건물을 짓기 위해 필요한 건물들을 짓는데에 필요한 총 시간 중 최댓값만 가져오면 됩니다. 

 

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>
using namespace std;
vector<int>vi[1003];
int D[1003],dp[1003];
int f(int i){
    int &ret=dp[i];
    if(ret!=-1)return ret;
    dp[i]=0;
    for(int j=0;j<(int)vi[i].size();j++){
        ret=max(ret,f(vi[i][j]));
    }
    ret+=D[i];
    return ret;
}
int main(){
    int T;scanf("%d",&T);
    while(T--){
        memset(dp,-1,sizeof(dp));
        int N,K,X,Y,W;
        scanf("%d%d",&N,&K);
        for(int i=1;i<=N;i++)vi[i].clear();
        for(int i=1;i<=N;i++)scanf("%d",&D[i]);
        for(int i=1;i<=K;i++){
            scanf("%d%d",&X,&Y);
            vi[Y].push_back(X);
        }
        scanf("%d",&W);
        printf("%d\n",f(W));
    }
    return 0;
}
 
cs
728x90

'BAEKJOON' 카테고리의 다른 글

BAEKJOON 1509번: 팰린드롬 분할  (0) 2022.05.08
BAEKJOON 11003번: 최솟값 찾기  (0) 2022.03.06
BAEKJOON 1701번: Cubeditor  (0) 2022.03.01
BAEKJOON 2252번: 줄세우기  (0) 2022.03.01
BAEKJOON 8913번: 문자열 뽑기  (0) 2022.02.26