其他分享
首页 > 其他分享> > 没有上司的舞会

没有上司的舞会

作者:互联网

package Week4;

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

/*题目描述
某大学有 n 个职员,编号为 1…n。
他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。
现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数 ri
​,但是呢,如果某个职员的直接上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。
所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。
输入格式
输入的第一行是一个整数 n。
第 2 到第 (n+1) 行,每行一个整数,第 (i+1) 行的整数表示 i 号职员的快乐指数ri。
第(n+2) 到第 2n 行,每行输入一对整数 l, k,代表 k 是 l 的直接上司。
输出格式
输出一行一个整数代表最大的快乐指数。*/
//dp[x][0]+=max(dp[son][1],dp[son][0]); // 如果x不去,则快乐值为+儿子去或者不去的最大值
//dp[x][1]+=dp[son][0]; // 如果x去,则快乐值为+儿子不去的最大值
public class P1352 {
    static int N;
    static int dp[][];
    static int arr[][];
    static int happy[];
    static List<Integer> list[];
    static int inDegree[];
    public static void main(String[] args) throws Exception {
        System.setIn(new FileInputStream("Solution.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        dp = new int[N+1][2];
        happy = new int[N+1];
        list = new List[N+1];
        inDegree = new int[N+1];
        for (int i = 1; i <= N; i++) {
            happy[i]=Integer.parseInt(br.readLine());
            list[i]=new ArrayList<Integer>();
        }
        for (int i = 1; i <= N-1; i++) {
            st = new StringTokenizer(br.readLine());
            int s = Integer.valueOf(st.nextToken());
            int e = Integer.valueOf(st.nextToken());
            list[e].add(s);
            inDegree[s]++;
        }
        int root=0;
        for (int i = 1; i <= N; i++) {
            if(inDegree[i]==0) {//找到跟节点,即入度为0的点就是跟节点
                root=i;
                break;
            }
        }
        
        dfs(root);
        System.out.println(Math.max(dp[root][0], dp[root][1]));
    }
    
    private static void dfs(int curr) {
        for (int i = 0; i < list[curr].size(); i++) {
            int son = list[curr].get(i);//当前点找儿子节点,一直找一直找到底
            dfs(son);
            dp[curr][1]+=dp[son][0];// 如果x去,则快乐值为+儿子不去的最大值
            dp[curr][0]+=Math.max(dp[son][0], dp[son][1]);// 如果x不去,则快乐值为+儿子去或者不去的最大值
        }
        dp[curr][1]+=happy[curr];//回溯时负值当前节点去的时候开心值
        
    }
    
    
    
}
View Code

 

标签:舞会,上司,java,没有,int,static,import,new,dp
来源: https://www.cnblogs.com/humiqi/p/15103677.html