题解 | #加分二叉树#

加分二叉树

https://www.nowcoder.com/practice/0196d17a175749178ca95aa40794dbb7

这道题最开始该考虑的是数组用n+1的大小还是n的大小,因为二叉树的节点是从1开始的,所以用n+1作为数组大小最好。

反复看几遍就懂了:
import java.util.*;
public class Main{
    private static int[][]dp;
    private static int[][]dp2;//存储关于位置的dp
    public static int process(int[]grades){
        int n=grades.length;
        dp=new int[n][n];
        dp2=new int[n][n];
        //叶子结点
        for(int i=1;i<n;i++){
            dp[i][i]=grades[i];
            dp2[i][i]=i;//因为区间节点从0开头,但是实际是从1开头的下标,所以+1
        }
        //非叶子节点
        for(int i=1;i<n;i++){
            for(int j=1;j+i<n;j++){
                    dp[j][i+j]=Integer.MIN_VALUE;
                for(int k=j;k<=i+j;k++){
                    int left=k==j?1:dp[j][k-1];
                    int right=k==j+i?1:dp[k+1][j+i];
                    int score=left*right+grades[k];
                    if(score>dp[j][j+i]){
                        dp[j][j+i]=score;
                        dp2[j][j+i]=k;//因为区间节点从0开头,但是实际是从1开头的下标,所以+1
                    }
                }
            }
        }
        return dp[1][n-1];
    }
    //前序遍历递归
    public static void preOrder(int l,int r){
        if(l>r) return;
        System.out.print(dp2[l][r]+" ");
        preOrder(l,dp2[l][r]-1);
        preOrder(dp2[l][r]+1,r);
    }
    public static void main(String[]args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[]grades=new int[n+1];
        for(int i=1;i<=n;i++){
            grades[i]=sc.nextInt();
        }
        System.out.println(process(grades));
        preOrder(1,n);
    }
}


全部评论

相关推荐

程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务