树形动态规划

该程序使用Java实现,基于状态转移方程处理一个包含6010个节点的树形结构。每个节点有两个状态(0和1),初始时计算每个节点的幸福值,然后通过深度优先搜索(DFS)遍历树,更新每个节点的状态值。最终找到根节点并输出其最大幸福值。
摘要由CSDN通过智能技术生成

没有上司的舞会

在这里插入图片描述
在这里插入图片描述
状态转移方程:
f ( u , 0 ) + = ∑ m a x ( f ( s i , 0 ) , f ( s i , 1 ) ) f ( u , 1 ) + = ∑ f ( s i , 0 ) \begin{aligned} &f(u,0)+=\sum max(f(s_i,0),f(s_i,1)) \\ &f(u,1)+=\sum f(s_i,0) \end{aligned} f(u,0)+=max(f(si,0),f(si,1))f(u,1)+=f(si,0)

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

public class Main{
    static int N=6010;
    static int[] happy=new int[N];
    static int[] h=new int[N];
    static int[] e=new int[N];
    static int[] ne=new int[N];
    static int idx=0;
    static int[][] f=new int[N][2];
    static boolean[] has_father=new boolean[N];
    public static void main(String[] args)throws IOException{
        BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
        int n=Integer.parseInt(in.readLine());
        for(int i=1;i<=n;i++)
            happy[i]=Integer.parseInt(in.readLine());
        String[] strs;
        Arrays.fill(h,-1);
        for(int i=0;i<n-1;i++){
            strs=in.readLine().split(" ");
            int a=Integer.parseInt(strs[0]);
            int b=Integer.parseInt(strs[1]);
            has_father[a]=true;
            add(b,a);
        }
        int root=1;
        while(has_father[root])root++;
        dfs(root);
        System.out.println(Math.max(f[root][0],f[root][1]));
    }
    static void add(int a,int b){
        e[idx]=b;ne[idx]=h[a];h[a]=idx++;
    }
    static void dfs(int u){
        f[u][1]+=happy[u];
        for(int i=h[u];i!=-1;i=ne[i]){
            int j=e[i];
            dfs(j);
            f[u][0]+=Math.max(f[j][0],f[j][1]);
            f[u][1]+=f[j][0];
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值