문제 풀이/백준(BOJ)
[Python] 백준 1516번 : 게임 개발
희조당
2022. 8. 5. 04:43
728x90
https://www.acmicpc.net/problem/1516
1516번: 게임 개발
첫째 줄에 건물의 종류 수 N(1 ≤ N ≤ 500)이 주어진다. 다음 N개의 줄에는 각 건물을 짓는데 걸리는 시간과 그 건물을 짓기 위해 먼저 지어져야 하는 건물들의 번호가 주어진다. 건물의 번호는 1부
www.acmicpc.net
💡 문제 풀이
위상 정렬 문제이다.
다른 위상 정렬과 다르게 DP와 같이 들어가 있는 문제이다.
주의해야 할 점은 어떤 건물을 건설할 때 요구하는 건물들이 다 완공되어야 한다.
즉, (가장 마지막에 건설한 건물의 시간) + (어떤 건물 건설 시간)이 더해진 값이 총 건설 시간이다.
✔️ 느낀 점
위상 정렬에 익숙해지고 있는데 이런 복합적인 문제가 나와서 너무 좋았다. 그리고 역시 DP는 나랑 안 맞는다.
이해하느라 너무 힘들었다.
💻 코드
import sys
from collections import deque
input = sys.stdin.readline
N = int(input())
graph = [[] for _ in range(N+1)]
indegree = [0] * (N+1)
cost = [0] * (N+1)
DP = [0] * (N+1)
for i in range(1, N+1):
tmp = list(map(int, input().split()))[:-1]
cost[i] = tmp[0]
for j in tmp[1:]:
graph[j].append(i)
indegree[i] += 1
q = deque()
for i in range(1, N+1):
if not indegree[i]:
q.append(i)
DP[i] = cost[i]
while q:
n = q.popleft()
for i in graph[n]:
indegree[i] -= 1
DP[i] = max(DP[i], DP[n] + cost[i])
if not indegree[i]: q.append(i)
for i in range(1, N+1):
print(DP[i], end='\n')