HUFS/HUFS 모각코 캠프
[모각코] 210728 Today I Learned
leta
2021. 7. 28. 23:00
<백준 1949번 - 우수 마을>
골드1... 함부로 건드리면 안된다... 진짜...
문제부터 잘 이해가 안 돼서 계속 읽었다. 겨우겨우 이해한 바는
- 각 노드에서 나아갈 수 있는 방향은 '우수마을' or 'not 우수마을' 이렇게 두 가지 경우.
- 루트 노드가 우수 마을이면 하위 노드는 우수 마을 일 수 없다.
- 루트 노드가 우수 마을이 아니면, 하위 노드는 우수 마을이거나 아니거나. (둘 중 최댓값....아마도)
이걸 dp에 저장하는 게 역시나 난관이었는데
dp[i][0] : 현재(i) 마을이 우수 마을이 아닌 경우
dp[i][1] : 현재(i) 마을이 우수 마을인 경우
로 저장했다.
제출했는데 recursion error 떠서 절망적이었다.. 근데 recursionlimit 풀어주니까 바로 됐다.
사실.. 어떻게 이렇게 빨리 풀 수 있었는지 잘 모르겠다.
모각코 하는 두 시간 동안 한 문제 풀기 정말 쉽지 않은데... 어쨌든 맞았으니까 넘어간다 ~!
import sys
sys.setrecursionlimit(10**6)
input = sys.stdin.readline
def village(start):
if visited[start]:
return
visited[start] = True
for i in tree[start]:
if not visited[i]:
village(i)
dp[start][0] += max(dp[i][0], dp[i][1])
dp[start][1] += dp[i][0]
n = int(input())
people = [0] + list(map(int, input().split()))
tree = [[] for i in range(n+1)]
visited = [0 for i in range(n+1)]
dp = [[0, people[i]] for i in range(n+1)] #[i][0]: 우수마을 x, [i][1]: 우수마을
for i in range(n-1):
a, b = map(int, input().split())
tree[a].append(b)
tree[b].append(a)
village(1)
print(max(dp[1][0], dp[1][1]))