https://www.acmicpc.net/problem/1949
트리 + dp + dfs 문제이므로 top-down 으로 내려갔다가 올라오면서 dp배열을 업데이트 해주는데,
🔴 백준 예시를 통한 이해
** dfs를 통해 dfs(현재노드,부모노드) 로 마지막 노드까지 탐방한다.
1. 먼저 시작은 1부터 가겠지용
자식노드가 2 이므로, 아래와 같은 결과
2. 2의 값을 구하기 위해서는 또 dfs(3,2)와 dfs(6,2) 진행
import java.io.*;
import java.util.*;
public class Main {
static int N;
static int[] person;
static int[][] dp;
static Vector<Integer>[] v;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
N = Integer.parseInt(br.readLine());
String[] input = br.readLine().split(" ");
person = new int[N + 1];
v = new Vector[N + 1];
dp = new int[N + 1][2];
for (int i = 0; i <= N; i++) v[i] = new Vector<>();
for (int i = 1; i <= N; i++) person[i] = Integer.parseInt(input[i - 1]);
for (int i = 0; i < N - 1; i++) {
input = br.readLine().split(" ");
int a = Integer.parseInt(input[0]);
int b = Integer.parseInt(input[1]);
v[a].add(b);
v[b].add(a);
}
dfs(1, 0);
bw.write(Math.max(dp[1][0], dp[1][1]) + "\n");
bw.flush();
}
public static void dfs(int n, int parent) {
for (int node : v[n]) {
if (node != parent) {
dfs(node, n);
dp[n][0] += Math.max(dp[node][0], dp[node][1]);
dp[n][1] += dp[node][0];
}
}
dp[n][1] += person[n];
}
}