首页 > 其他分享 >2110 加分二叉树

2110 加分二叉树

时间:2025-01-20 10:28:14浏览次数:3  
标签:int 30 tree subtree 二叉树 2110 节点 out

描述

设一个 n 个节点的二叉树 tree 的中序遍历为 (1,2,3,⋯,n),其中数字 1,2,3,⋯,n 为节点编号。每个节点都有一个分数(均为正整数),记第 i 个节点的分数为 di​,tree 及它的每个子树都有一个加分,任一棵子树 subtree(也包含 tree 本身)的加分计算方法如下:
记 subtree 的左子树加分为 l,右子树加分为 r,subtree 的根的分数为 a,则 subtree 的加分为:
l×r+a
若某个子树为空,规定其加分为 1,叶子的加分就是叶节点本身的分数。不考虑它的空子树。
试求一棵符合中序遍历为 (1,2,3,⋯,n) 且加分最高的二叉树 tree。

要求输出:

  1. tree 的最高加分;
  2. tree 的前序遍历。

输入描述

第一行一个整数 n 表示节点个数;
第二行 n 个空格隔开的整数,表示各节点的分数。

输出描述

第一行一个整数,为最高加分 b;
第二行 n 个用空格隔开的整数,为该树的前序遍历。

样例输入 1 

5
5 7 1 2 10

样例输出 1 

145
3 1 2 4 5

提示

数据范围与提示
对于 100% 的数据,n<30,b<100,结果不超过 4×109。

c++代码

#include <iostream>
using namespace std;
int n;
int a[30];
int root[30][30];
int f[30][30];

void out(int l,int r){
      if(l>r) return;
      if(l==r){
            cout<<l<<" ";
            return;
      }
    cout<<root[l][r]<<" ";
    out(l,root[l][r]-1); 
    out(root[l][r]+1,r);
  } 

int dp(){
      for(int i=n;i>=1;i--) {
            for(int j=i+1;j<=n;j++){
                    for(int k=i;k<=j;k++){
                         if(f[i][j]<(f[i][k-1]*f[k+1][j]+f[k][k])) {
                           f[i][j]=f[i][k-1]*f[k+1][j]+f[k][k];
                           root[i][j]=k;    
                         }
                }
           }
      }
  } 

int main(){
      cin>>n;
      for(int i=1;i<=n;i++){
            cin>>a[i];
      }
    for(int i=1;i<=n;i++){
          f[i][i]=a[i]; 
          f[i][i-1]=1;
      } 
    dp();
    cout<<f[1][n]<<endl;
    out(1,n);
    return 0;
  } 

标签:int,30,tree,subtree,二叉树,2110,节点,out
From: https://blog.csdn.net/jijibao188/article/details/145239887

相关文章

  • 【9.1】树结构-从先序遍历还原二叉树
    一、题目        我们从二叉树的根节点root 开始进行深度优先搜索。        在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为D,则其直接子节点的深度为D+1。根节点的深度为0)。       ......
  • 代码随想录:二叉树的公共祖先
    这道题是真巧妙,巧妙有两点不用区分两个目标节点,只要命中了,就往上代码可以处理一个节点本来就是另一个节点祖先的情况/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode(int......
  • 大一计算机的自学总结:二叉树三种序的非递归遍历
    前言二叉树的递归遍历在我上一篇“二叉树及其三种序的递归遍历”里有。其中用到的“BinaryTree”也在链接文章的“二叉树的创建”里。大一计算机的自学总结:二叉树及其三种序的递归遍历而非递归遍历是借助栈的特性,会更难更复杂。TvT......一、先序遍历#include<bits/stdc++.......
  • 【二叉树】已知前序中序、中序后序遍历构造二叉树
    105.从前序与中序遍历序列构造二叉树-力扣(LeetCode)/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx......
  • vscode使用github.211014
    1,vscode打开terminal,生成RSA密钥,并查看蜜月PSD:\\code\\SQL>gitinitReinitializedexistingGitrepositoryinD:/code/SQL/.git/PSD:\\code\\SQL\>gitconfig--globaluser.nameamadeusPSD:\\code\\SQL\>gitconfig--globaluser.emailvegas......
  • 数据结构—《二叉树的定义与特性》
    目录1.二叉树的定义2.特殊的二叉树1)满二叉树2)完全二叉树3)二叉排序树。4)平衡二又树。5)正则二文树3.二叉树的性质4.二叉树的存储结构1)顺序存储结构2)链式存储结构1.二叉树的定义二叉树是一种特殊的树形结构,其特点是每个结点至多只有两棵子树(即二叉树中不存在度大......
  • 数据结构之链式二叉树
    前言:前面我们学习了树相关的概念及堆的实现,今天来看看二叉树的实现。正式实现二叉树前,我们先了解一些基础知识。对于二叉树基础知识不清楚的可以观看数据结构------树这篇文章,回顾一下知识,有助于理解二叉树。二叉树的遍历方式都有哪些呢?.前序遍历:按照根节点,左节点,右节......
  • 代码随想录:最大二叉树
    白送/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx):val(x),left(nullptr),right(nullptr){}......
  • 代码随想录:从中序与后序遍历序列构造二叉树
    /**Definitionforabinarytreenode.structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode():val(0),left(nullptr),right(nullptr){}TreeNode(intx):val(x),left(nullptr),right(nullptr){}TreeNode(intx,TreeNo......
  • 代码随想录:完全二叉树的节点个数
    拿到一个节点,先判断是不是等边三角形,若是直接返回2^n-1,位运算写在专题中/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*......