树形dp2

力扣相同题目:二叉树中的最大路径和也需要看一看,用递归做的 alt alt

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[] node=new int[n+1];
        int[] parent=new int[n+1];
        int[] dp=new int[n+1];
        int[] dp1=new int[n+1];
        for(int i=1;i<=n;i++){
            node[i]=sc.nextInt();
            dp[i]=node[i];
            dp1[i]=node[i];
        }
        for(int i=1;i<=n;i++){
            parent[i]=sc.nextInt();
        }
        int max=0;
        for(int i=n;i>1;i--){
            //dp数组用来记录每次访问的某个节点的单路径最大值,即当前节点,当前节点+左子树或者当前节点+右子树的三者的最大值
            dp[parent[i]]=Math.max(node[parent[i]]+dp[i],node[parent[i]]);
            //dp1用来记录某个节点的最大值,每次从子节点依次向上更新,更新父节点。
            dp1[parent[i]]=Math.max(dp1[parent[i]],dp1[parent[i]]+dp[i]);
            //取每个节点的最大值即为最终结果
            max=Math.max(max,dp1[parent[i]]);
        }
        if(n==1){
            System.out.println(node[1]);
            return ;
        }
        System.out.println(max);
    }
}
全部评论

相关推荐

求面试求offer啊啊啊啊:1600一个月?
点赞 评论 收藏
分享
Ncsbbss:又想干活又想要工资,怎么什么好事都让你占了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务