首页 > 其他分享 >#yyds干货盘点# 动态规划专题:加分二叉树

#yyds干货盘点# 动态规划专题:加分二叉树

时间:2022-11-26 20:32:10浏览次数:41  
标签:yyds cur int tree 干货 二叉树 节点 dp

1.简述:

描述

设一个n个节点的二叉树tree的中序遍历为(l,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第j个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:

subtree的左子树的加分× subtree的右子树的加分+subtree的根的分数

若某个子树为主,规定其加分为1,叶子的加分就是叶节点本身的分数。不考虑它的空子树。 试求一棵符合中序遍历为(1,2,3,…,n)且加分最高的二叉树tree。

要求输出:

    (1)tree的最高加分

    (2)tree的前序遍历

数据范围: #yyds干货盘点# 动态规划专题:加分二叉树_二叉树,每个节点的值满足 #yyds干货盘点# 动态规划专题:加分二叉树_二叉树_02

输入描述:

第一行输入一个正整数 n ,表示二叉树节点的个数。

第二行输入 n 个正整数,表示二叉树中序遍历的节点分数

输出描述:

输出最高加分和前序遍历结果。

示例1

输入:

5
5 7 1 2 10

输出:

145
3 1 2 4 5

2.代码实现:

import java.util.*;

public class Main {
static int[][][] dp = new int[32][32][2];
static List<Integer> list = new ArrayList<>();
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] val = new int[n + 1];
for (int i = 1; i <= n; ++i)
val[i] = sc.nextInt();

for (int i = 0; i < n; ++i) {
for (int j = 1; j + i <= n; ++j) {
int r = j + i;
if (j == r) {
dp[j][r][0] = val[j];
dp[j][r][1] = j;
}else {
for (int k = j; k <= r; ++k) {
int left = k == j ? 1 : dp[j][k - 1][0];
int right = k == r ? 1 : dp[k + 1][r][0];
int sum = left * right + val[k];
if (sum > dp[j][r][0]) {
dp[j][r][0] = sum;
dp[j][r][1] = k;
}
}
}
}
}
getPre(dp[1][n][1], 1, n);
System.out.println(dp[1][n][0]);
for (int i: list)
System.out.print(i + " ");
}
private static void getPre(int cur, int l, int r) {
if (l > cur || r < cur) return;
list.add(cur);
getPre(dp[l][cur - 1][1], l, cur - 1);
getPre(dp[cur + 1][r][1], cur + 1, r);
}
}

标签:yyds,cur,int,tree,干货,二叉树,节点,dp
From: https://blog.51cto.com/u_15488507/5889159

相关文章

  • #yyds干货盘点# LeetCode 腾讯精选练习 50 题:反转字符串中的单词 III
    题目:给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 示例1:输入:s="Let'stakeLeetCodecontest"输出:"s'teLekatedoCteeL......
  • 数据结构实验(五)二叉树
    6-1二叉树的遍历就是简单的遍历voidInorderTraversal(BinTreeBT){if(BT==NULL)return;if(BT->Left!=NULL)InorderTraversal(BT->Left);......
  • 每日算法之重建二叉树
    JZ7重建二叉树描述给定节点数为n的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,......
  • 102. 二叉树的层序遍历
    102.二叉树的层序遍历给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],......
  • 留给留下的同学的一些写代码的干货
    Vim我不会用……VSCode确实很好用,在没有扩展的情况下也可以表现的非常优秀窗口舒适度ctrl+-和ctrl+=可以放缩界面大小设置里FontSize改字体大小,LineHe......
  • #yyds干货盘点# 动态规划专题:括号区间匹配
    1.简述:描述给定一个由'[',']','(',‘)’组成的字符串,请问最少插入多少个括号就能使这个字符串的所有括号左右配对。例如当前串是"([[])",那么插入一个']'即可满足。数据范围......
  • 当“流程管理”遇上“数字化”——听资深BPM实践者的干货分享
    "IT有得聊”是机械工业出版社旗下IT专业资讯和服务平台,致力于帮助读者在广义的IT领域里,掌握更专业、实用的知识与技能,快速提升职场竞争力。直播简介直播主题:当“流程管理”......
  • HDC 2022 开发者主题演讲与技术分论坛干货分享(附课件)
       11月4日-11月6日,HDC2022在东莞成功举办,这是一场大规模落地的思维与技术的碰撞,众多业内专家到场,共话未来。其中,开发者主题演讲围绕增强的声明式开发体系,通过一个De......
  • HDC 2022 开发者主题演讲与技术分论坛干货分享(附课件)
     11月4日-11月6日,HDC2022在东莞成功举办,这是一场大规模落地的思维与技术的碰撞,众多业内专家到场,共话未来。其中,开发者主题演讲围绕增强的声明式开发体系,通过一个Demo......
  • 二叉树的度
    二叉树结点的度(分支度)指该节点引出的边数(节点下面的边)。二叉树结点有3种可能的度:度为0,为叶子节点。度为1,只有左子树或者右子树的节点。度为2,有左右节点的节点。......