Backjoon Online Judge 

"1005번 : ACM Craft" 문제입니다.


문제 링크 : https://www.acmicpc.net/problem/1005


문제에서 순서대로 건물을 지어야 하고 그 순서가 규칙없이 주어지므로 먼저 vector에 각 건물의 선행순서를 저장했습니다.

 이후 특정 건물을 짓기 위해 그 건물을 짓는데 걸리는 시간과 가장 오래 걸리는 선행 건물을 짓는 시간의 합을 구했습니다. (특정 건물의 선행 건물 중 시간 소요가 가장 오래 걸리는 건물이 완성되면 다른 건물들은 완성 상태이다.)

 선행 건물에도 또 다른 선행순서가 존재할 수 있기 때문에 이 부분을 재귀를 통해 구현하였습니다.


아래는 코드 설명입니다.

 -먼저 순서를 저장할 건물 갯수(최대 1000개)만큼의 vector와 시간과 값을 저장할 배열을 만들었습니다.

 - 이후 특정 건물의 소요 시간을 알기위해 그 건물의 소요 시간과 선행 건물의 소요 시간 중 가장 큰 소요시간을 가지는 값을 더했고 이 과정에서 max 함수와 재귀를 이용했습니다.


코드는 C++로 작성하였습니다.

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <algorithm>
#include <vector>
#include <memory.h>
 
#define MAX 1001
 
using namespace std;
 
int time[MAX];
int result[MAX];
vector<int> rule[MAX];
 
int dp(int W) {
    int &answer = result[W];
    if (answer) {
        return answer;
    }
    answer = time[W];
    while (!(rule[W].empty())) {
        int prev = rule[W].back();
        rule[W].pop_back();
        answer = max(answer, time[W] + dp(prev));
    }
    return answer;
}
 
int main() {
    int T, N, K, W, temp1, temp2;
    cin >> T;
    while (T--) {
        cin >> N >> K;
        memset(result, 0sizeof(result)); 
        for (int i = 1; i <= N; i++) {
            cin >> time[i];
        }
        for (int i = 0; i < K; i++) {
            cin >> temp1 >> temp2;
            rule[temp2].push_back(temp1);
        }
        cin >> W;
        cout << dp(W) << endl;
        for (int i = 0; i < MAX; i++) {
            rule[i].clear();
        }
    }
    cin >> W;
    return 0;
}
cs


'Programming 문제풀이 > Backjoon Online Judge' 카테고리의 다른 글

2293번 : 동전 1  (0) 2018.05.15
10844번 : 쉬운 계단 수  (0) 2018.05.13
1463번 : 1로 만들기  (0) 2018.05.10
2579번 : 계단 오르기  (0) 2018.05.05
1932번 : 숫자삼각형  (0) 2018.05.01