[BOJ] 1949. ์šฐ์ˆ˜ ๋งˆ์„ (๐Ÿฅ‡, ํŠธ๋ฆฌ DP)

lemythe423ยท2024๋…„ 3์›” 2์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
119/133
post-thumbnail

๐Ÿ”—

ํ’€์ด

ํŠธ๋ฆฌ ํ˜•ํƒœ์ง€๋งŒ ์–‘๋ฐฉํ–ฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฃจํŠธ ๋…ธ๋“œ๋Š” ์–ด๋Š ๋…ธ๋“œ๊ฐ€ ๋˜์–ด๋„ ์ƒ๊ด€ ์—†๋Š” ๊ตฌ์กฐ์ด๋‹ค. ๋ฌธ์ œ๋งŒ ์ฝ์œผ๋ฉด ๋งˆ์„ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๊ณ  ๊ทธ ๋‹ค์Œ ๋งˆ์„์„ ๊ฑด๋„ˆ๋›ฐ๋Š” ์‹์œผ๋กœ๋งŒ ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์ง€๋งŒ ์‹ค์ œ๋กœ ์˜ˆ์ œ๋ฅผ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

2 - 6 ์€ ์„œ๋กœ ์ธ์ ‘ํ•ด์žˆ์ง€๋งŒ ๋‘˜ ๋‹ค ์šฐ์ˆ˜ ๋งˆ์„์€ ์•„๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ์ž๊ฐ€ ์šฐ์ˆ˜ ๋งˆ์„๊ณผ ์ธ์ ‘ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋„ค ๊ฐœ์˜ ๋งˆ์„์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ๊ฐ€ 14000์œผ๋กœ ์ตœ๋Œ€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

๋ชจ๋“  ๋…ธ๋“œ๋Š” ์„ ํƒ๋˜๊ฑฐ๋‚˜ ์„ ํƒ๋˜์ง€ ์•Š๋Š” ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์„ ํƒ์ด ๋˜์—ˆ๋‹ค๋ฉด ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์€ ์„ ํƒ๋˜๋ฉด ์•ˆ ๋œ๋‹ค. ๋ฐ˜๋Œ€๋กœ ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์„ ํƒ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์€ ์„ ํƒ๋  ์ˆ˜๋„ ์žˆ๊ณ  ์„ ํƒ๋˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์œ„์˜ 2-6๊ณผ ๊ฐ™์€ ๊ด€๊ณ„์ฒ˜๋Ÿผ 2๊ฐ€ ์„ ํƒ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ 6๋ฒˆ ๋…ธ๋“œ๋Š” ์„ ํƒ๋  ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ 6์„ ์„ ํƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์„ ํƒํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋†’์€ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด ์„ ํƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•ด์ง„๋‹ค. ์˜ˆ์ œ์—์„œ๋Š” 7๋ฒˆ ๋…ธ๋“œ๊ฐ€ 7000์ด๊ธฐ ๋•Œ๋ฌธ์— 7๋ฒˆ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ณ  6๋ฒˆ์„ ์„ ํƒํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ตœ๋Œ€๊ฐ’์„ ๊ฐ€์ง€๊ธฐ์— ์œ ๋ฆฌํ•˜๋‹ค.

N๊ฐœ์˜ ํ–‰์— ๋Œ€ํ•ด 2๊ฐœ์˜ ์—ด์„ ๊ฐ€์ง€๋Š” dp ๋ฐฐ์—ด์„ ์„ ์–ธํ•˜๊ณ  ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ ๊ฒฝ์šฐ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š” ์ธ๊ตฌ์˜ ํ•ฉ์„ 0์—ด์— ์„ ํƒํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ 1์—ด์— ์ €์žฅํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ํƒ์ƒ‰์˜ ์ˆœ์„œ๋Š” ํŠธ๋ฆฌ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฃจํŠธ ๋…ธ๋“œ์—์„œ ์‹œ์ž‘ํ•ด์„œ ๋ฆฌํ”„ ๋…ธ๋“œ๊นŒ์ง€ ํƒ์ƒ‰ํ•œ ํ›„ ๋ฆฌํ”„ ๋…ธ๋“œ์—์„œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๊ฑฐ๊พธ๋กœ ๊ณ„์‚ฐํ•ด๋‚˜์˜ค๋Š” ๋ฐฉ์‹์ด ํŽธ๋ฆฌํ•˜๋‹ค. ์–‘๋ฐฉํ–ฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฃจํŠธ ๋…ธ๋“œ๋ฅผ ์–ด๋–ค ๋…ธ๋“œ๋กœ ์„ ์ •ํ•ด๋„ ์ƒ๊ด€์ด ์—†๊ณ  ๋ฆฌํ”„ ๋…ธ๋“œ๋„ ๋”ฑ ์ž˜๋ผ ๋ฆฌํ”„ ๋…ธ๋“œ๋ผ๊ณ  ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. ๊ทธ๋ž˜์„œ visited ๋ฐฐ์—ด์„ ํ†ตํ•ด์„œ ์•„๋ฌด ๋…ธ๋“œ๋‚˜ ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ์žก์•„์„œ ์„ ํƒํ•œ ํ›„ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค๋กœ ์ด๋™ํ•˜๋ฉด์„œ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์„œ ์ œ์™ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํ”„ ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š”๋‹ค.

์šฐ์„  ๋ฐฉ๋ฌธํ•œ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ๋Š” ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ ๊ฒฝ์šฐ๋Š” ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ๋…ธ๋“œ์— ํ•ด๋‹นํ•˜๋Š” ์ธ๊ตฌ ์ˆ˜๋ฅผ ํ•ฉํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— dp[ํ•ด๋‹น๋…ธ๋“œ][0] += (ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ธ๊ตฌ ์ˆ˜)๋ฅผ ํ•œ๋‹ค. ์ดํ›„ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค(์ž์‹ ๋…ธ๋“œ)๋ฅผ ๋Œ๋ฉด์„œ ์•„๋ž˜์˜ ์ ํ™”์‹์„ ๋งŒ์กฑํ•˜๋„๋ก dp๋ฅผ ์ฑ„์›Œ๋‚˜๊ฐ„๋‹ค.

dp[ํ˜„์žฌ ๋…ธ๋“œ][0] += dp[์ž์‹ ๋…ธ๋“œ][1] (ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์„ ํƒ O, ์ž์‹ ๋…ธ๋“œ๋Š” ์„ ํƒX)
dp[ํ˜„์žฌ ๋…ธ๋“œ][1] += Math.max(dp[์ž์‹ ๋…ธ๋“œ][0], dp[์ž์‹ ๋…ธ๋“œ][1]) (ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ž์‹ ๋…ธ๋“œ ์ค‘์—์„  ๋” ํฐ ๊ฐ’๋งŒ ์„ ํƒ)

import java.util.*;
import java.io.*;

public class Main {
    static List<List<Integer>> tree;
    static int[] population;
    static int[][] dp;
    static void dfs(int cur, boolean[] visited) {
        dp[cur][0] += population[cur];
        
        visited[cur] = true;
        for (int child : tree.get(cur)) {
            if (visited[child] == true) continue;
            dfs(child, visited);
            dp[cur][0] += dp[child][1];
            dp[cur][1] += Math.max(dp[child][0], dp[child][1]);
        }
        visited[cur] = false;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        population = new int[N];
        for (int i = 0; i < N; i++) {
            population[i] = Integer.parseInt(st.nextToken());
        }

        tree = new ArrayList<>();
        for (int i = 0; i < N; i++) {
            tree.add(new ArrayList<>());
        }

        int a; 
        int b;
        for (int i = 0; i < N-1; i++) {
            st = new StringTokenizer(br.readLine());
            a = Integer.parseInt(st.nextToken());
            b = Integer.parseInt(st.nextToken());
            tree.get(a-1).add(b-1);
            tree.get(b-1).add(a-1);
        }

        dp = new int[N][2];
        boolean[] visited = new boolean[N];
        dfs(0, visited);
        
        System.out.println(Math.max(dp[0][0], dp[0][1]));
    }
}
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€