没有上司的舞会

没有上司的舞会

1. 树形结构
2. 层级之间有关联


5
3 4
1 2 6 7

5去 = 3和4不去的最大值
5不去 = 3和4 不去的最大值, 3和4去的最大值

3去 = 1和2不去的值
3不去 = 1和2去,1和2不去的最大值

。。。

 

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class P1352 {
    private static int answer = 0;
    private static int[][] dp;
    private static int[] data;
    private static ArrayList<Integer>[] arraysLists;
    public static void main(String[] args) throws Exception {
        System.setIn(new FileInputStream("C:/Users/Administrator/Downloads/P1352_2.in"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.valueOf(st.nextToken());
        data = new int[n+1];
        for (int i = 1; i <= n; i++) {
            st = new StringTokenizer(br.readLine());
            data[i] = Integer.valueOf(st.nextToken());
        }
        int[] parent = new int[n+1];
        arraysLists = new ArrayList[n+1];
        for (int i = 0; i <= n; i++) {
            arraysLists[i] = new ArrayList<>();
        }
        for (int i = 1; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            int l = Integer.valueOf(st.nextToken());
            int k = Integer.valueOf(st.nextToken());
            parent[l] = k;
            arraysLists[k].add(l);
        }
        int root = 0;
        for (int i = 1; i <= n; i++) {
            if(parent[i] == 0) {
                root = i;
                break;
            }
        }

        dp = new int[n+1][2];

        dfs(root);

        System.out.println(answer);
    }

    private static void dfs(int cur) {
        dp[cur][1] = data[cur];
        dp[cur][0] = 0;
        for (int i = 0; i < arraysLists[cur].size(); i++) {
            int next = arraysLists[cur].get(i);
            dfs(next);
            dp[cur][1] += dp[next][0];
            dp[cur][0] += Math.max(dp[next][0], dp[next][1]);
        }

        if(Math.max(dp[cur][0], dp[cur][1]) > answer)
        answer = Math.max(dp[cur][0], dp[cur][1]);
    }
}

 

posted @ 2021-07-06 19:32  姓蜀名黍  阅读(82)  评论(0)    收藏  举报