쌓고 쌓다

[백준] 작업 2056번 C++ 풀이 본문

알고리즘/백준

[백준] 작업 2056번 C++ 풀이

승민아 2022. 1. 20. 20:57

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

 

2056번: 작업

수행해야 할 작업 N개 (3 ≤ N ≤ 10000)가 있다. 각각의 작업마다 걸리는 시간(1 ≤ 시간 ≤ 100)이 정수로 주어진다. 몇몇 작업들 사이에는 선행 관계라는 게 있어서, 어떤 작업을 수행하기 위해

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> v[10001];
int dp[10001];
int Time[10001];
int N;
int main(void)
{
	cin >> N;
	int cost, num;
	for (int i = 0; i < N; i++)
	{
		cin >> cost >> num;
		Time[i] = cost;
		for (int j = 0; j < num; j++)
		{
			int temp;
			cin >> temp;
			v[i].push_back(temp-1); // 총 N개가 있다면 0~N-1번으로 모든 번호를 정할겁니다.
		}
	}

	int res = 0;
	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < v[i].size(); j++)
		{
			dp[i] = max(dp[i],dp[v[i][j]]); 
            // i번째의 선행작업들중 가장 오래 걸리는 시간을 dp[i]에 저장
		}
		dp[i] += Time[i]; // i번째의 작업시간을 마지막에 더해줍니다.
		res = max(res,dp[i]); // 최대시간이 답이라 max 사용
	}

	cout << res;
}

dp[i]는 i번째 작업을 완료하기 위해 걸리는 최대시간을 저장해줍니다.

dp[i]는 i번째의 선행작업들이 걸리는 최대시간에 i번째의 작업시간을 더해주면 i번째 작업을 완료하는데 걸리는 시간이 됩니다.

Comments