没有上司的舞会
没有上司的舞会
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]); } }

浙公网安备 33010602011771号