【leetcode】1130. 叶值的最小代价生成树

news2024/9/20 23:22:46

1130. 叶值的最小代价生成树

  • 1、问题描述
  • 2、解决方案
    • 2.1、动态规划
      • 2.1.1、问题分析
      • 2.1.2、代码实现
    • 2.2、单调栈

1、问题描述

1130. 叶值的最小代价生成树
给你一个正整数数组 arr,考虑所有满足以下条件的二叉树:

  • 每个节点都有 0 个或是 2 个子节点。
  • 数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应。
  • 每个非叶节点的值等于其左子树和右子树中叶节点的最大值的乘积。

在所有这样的二叉树中,返回每个非叶节点的值的最小可能总和。这个和的值是一个 32 位整数。如果一个节点有 0 个子节点,那么该节点为叶节点。

示例 1
可能的树

  • 输入:arr = [6,2,4]
  • 输出:32
  • 解释:有两种可能的树,第一种的非叶节点的总和为 36 ,第二种非叶节点的总和为 32 。

示例 2
可能的树

  • 输入:arr = [4,11]
  • 输出:44

2、解决方案

2.1、动态规划

2.1.1、问题分析

本题本质上就是根据数组arr生成二叉树,然后从所有可能的二叉树中选择代价最小的二叉树,即非叶子节点之和最小的二叉树。由于数组与二叉树中序遍历的叶子节点对应,并且每个节点的子节点个数为0或2,因此问题可以简化为数组arr的拆分问题:对于一个数组,我们可以将它拆分为两部份,分别对应其左右子树,然后递归的对左右子树进行处理,直到剩余1个元素为止。每种拆分方案就对应一种二叉树。
上述的拆分本质就是分治:将大问题拆分为小问题,这里可以采用动态规划算法,对应的转移方程:
假设mk[start][end]表示arr在[start,end]区间内的最大值,则
m k [ s t a r t ] [ e n d ] = { a r r [ s t a r t ] , s t a r t = = e n d m a x ( a r r [ s t a r t ] , m k [ s t a r t + 1 ] [ e n d ] ) , s t a r t < e n d mk[start][end] = \left\{ \begin{matrix} arr[start], start == end \\ max(arr[start], mk[start + 1][end]), start < end \\ \end{matrix} \right. mk[start][end]={arr[start],start==endmax(arr[start],mk[start+1][end]),start<end
假设dp[start][end]表示数组arr在[start,end]区间内的最小代价,则
d p [ s t a r t ] [ e n d ] = { 0 , s t a r t = = e n d min ⁡ i ∈ [ s t a r t , e n d ) ( d p [ s t a r t ] [ i ] + d p [ i + 1 ] [ e n d ] + m k [ s t a r t ] [ i ] ∗ m k [ i + 1 ] [ e n d ] ) , s t a r t < e n d dp[start][end] = \left\{ \begin{matrix} 0, start == end \\ \min_{i\in \mathcal{[start,end)}}(dp[start][i] + dp[i+1][end] + mk[start][i] * mk[i+1][end]), start < end \\ \end{matrix} \right. dp[start][end]={0,start==endmini[start,end)(dp[start][i]+dp[i+1][end]+mk[start][i]mk[i+1][end]),start<end

2.1.2、代码实现

class Solution {
public:
    int mctFromLeafValues(vector<int>& arr) {
        int length = arr.size();
        vector<vector<int>> dp(length, vector<int>(length, INT_MAX));
        vector<vector<int>> mk(length, vector<int>(length, 0));
        for(int end = 0; end < length; ++end){
            dp[end][end] = 0;
            mk[end][end] = arr[end];
            for(int start = end - 1; start >= 0; --start){
            	//这里找[start,end]区间内的最大值
                mk[start][end] = arr[start] > mk[start + 1][end] ? arr[start] : mk[start + 1][end];
                for(int split = start; split < end; ++split){
                	//计算当前区间[start,end]内以split分割后的代价
                    int val = dp[start][split] + dp[split + 1][end] + mk[start][split] * mk[split + 1][end];
                    //当前区间[start,end]内所有分割的最小代价
                    dp[start][end] = val < dp[start][end] ? val : dp[start][end];
                }
            }
        }
        return dp[0][length - 1];
    }
};

2.2、单调栈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/594401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文3000字实现基于Selenium+Python的web自动化测试框架

一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid。 Selenium IDE&#xff1a;Firefo…

2.4 IDEA开发词频统计项目

一、词频统计准备工作 &#xff08;一&#xff09;启动集群的HDFS与Spark 启动HDFS服务 启动Spark集群 &#xff08;二&#xff09;在HDFS上准备单词文件 在master虚拟机上创建单词文件 - words.txt 将单词文件上传到HDFS指定目录/wordcount/input 二、本地模式运行Sp…

RCE漏洞演示,墨者靶场

#案列演示 打开墨者靶场&#xff0c;黑盒#命令注入执行分析 这个功能点有这么个功能&#xff0c;进行类似的像我们电脑上ping命令&#xff0c;这相当于就满足了命令&#xff0c;明显可能出现命令执行漏洞&#xff0c;可控变量和漏洞函数都存在。第一要去分析是什么操作系统&am…

批量 ping 网段的终极方法

我们分析和判定网络故障&#xff0c;如果有 10 设备&#xff0c;100 台设备&#xff0c;1000 台设备怎么办&#xff1f;一个个 ping 过去人都要疯掉了&#xff0c;这种情况在大型网络中我们有可能遇到&#xff0c;那怎么办呢&#xff1f;来听听海翎光电小编的一点看法吧&#x…

Spark写入Hive报错Mkdir failed on :com.alibaba.jfs.JindoRequestPath

1. 报错内容 23/05/31 14:32:13 INFO [Driver] FsStats: cmdmkdirs, srcoss://sync-to-bi.[马赛克].aliyuncs.com/tmp/hive, dstnull, size0, parameterFsPermission:rwx-wx-wx, time-in-ms32, version3.5.0 23/05/31 14:32:13 ERROR [Driver] ApplicationMaster: User class …

八大技术架构——升级之路

目录 一、单机架构 简介 工作原理 架构优缺点 相关软件 二、应用数据分离架构 简介 工作原理 架构优缺点 三、应用服务集群架构 简介 出现原因 工作原理 架构优缺点 相关软件 四、读写分离/主从分离架构 简介 工作原理 架构优缺点 相关软件 五、冷热分离架…

JMeter数据库性能测试指南:全面掌握基础操作

1.网络请求时间 2.数据库查询的时间 数据库性能指标 TPS:每秒事务数&#xff08;一秒钟服务器处理的事务数&#xff0c;事务指&#xff0c;请求出去到响应回来的整个过程的时间&#xff09; QPS:每秒查询量&#xff08;就是数据库每秒执行的SQL数量&#xff0c;包含insert/…

239:设置extent:bbox,限制瓦片图的加载范围,不加载空白瓦片

第239个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中加载geoserver发布的数据,这里主要介绍extent,设置bbox附加载layer上,目的是bbox在可视范围内才加载瓦片,否则不加载,好处是不用加载空白的瓦片数据。 直接复制下面的 vue+openlayers源代码,操作…

Odoo 16的docker部署以及vscode环境配置

之前一直使用Odoo源码配置开发环境&#xff0c;安装的步骤比较多&#xff0c;费时。趁着升级到16版本的机会&#xff0c;尝试使用docker快速配置Odoo的VSCode开发环境。 1 系统环境 &#xff08;1&#xff09;操作系统&#xff1a;ubuntu 20.04 Alternative downloads | Ubu…

Eclipse 教程 完结中

Eclipse 快捷键 关于快捷键 Eclipse 的很多操作都提供了快捷键功能&#xff0c;我们可以通过键盘就能很好的控制 Eclipse 各个功能&#xff1a; 使用快捷键关联菜单或菜单项使用快捷键关联对话窗口或视图或编辑器使用快捷键关联工具条上的功能按钮 Eclipse 快捷键列表可通过…

可节省60% MCU开发成本的NV080D-S8,单片机语音芯片在恒温碗上的应用

社会在不断进步&#xff0c;科技在不断发展&#xff0c;如今的恒温碗不仅带有温度显示功能&#xff0c;更附带有语音播报&#xff0c;能更好地知晓当前饭菜&#xff0c;变凉或过烫的情况&#xff0c;有效避免伤害宝宝脆弱的肠胃&#xff1b; 广州九芯电子推出了一款&#xff0c…

dynamic-datasource动态数据源学习

学习链接 spring整合mybatis的核心思路 & 数据源动态切换 & 多数据源事务控制 - 自己的链接&#xff08;本篇文章的上篇&#xff09; Mybatisplus生成代码配置 & p6spy打印sql & mybatis日志打印 & mybatisplus用法 dynamic-datasource-spring-boot-sta…

LabVIEWCompactRIO 开发指南第六章44 同步模块

同步模块 某些应用&#xff08;如振动或声音测量&#xff09;需要通道之间的高电平&#xff08;低于100nS&#xff09;同步。本节讨论基于增量Σ的模块和扫描&#xff08;SAR&#xff09;模块的时序和同步。任何未被归类为三角积分的NIC系列I/O模块都被归类为SAR。 同步增量西…

ThreadLocal源码

介绍 ThreadLocal是一个线程的本地变量&#xff0c;也就意味着这个变量是线程独有的&#xff0c;是不能与其他线程共享的。这样就可以避免资源竞争带来的多线程的问题。 但是&#xff0c;这种解决多线程安全问题的方式和加锁方式&#xff08;synchronized、Lock) 是有本质的区…

过来人建议:强烈安利本科生都去学Java编程!现在转行还不晚!

为什么标题这么说呢&#xff0c;因为Java的工资香啊&#xff0c;刚入门的小白就有 1w&#xff0c;转正后更多&#xff0c;而且越老越吃香&#xff01; 我们学一门技术在身&#xff0c;走到哪里都不怕&#xff0c;java是技术岗&#xff0c;不带销售性质&#xff0c;加班要分公司…

unity与oculus quest开发设置流程

目录 预准备quest项目的构建PC运行参考文章 版本&#xff1a; unity&#xff1a;2021 adb&#xff08;保证用USB连接PC和头显的时候能允许调试和数据访问&#xff09; macOS 当USB连接之后&#xff0c;需要带上头显将是否允许数据调试和访问的对话框选择允许。 文件中assets放…

2.6 Hello World 及简单语法规则

2.6 Hello World 及简单语法规则 新建文件夹&#xff0c;用于存放代码 新建一个Java文件 早期我们只是会建立txt文本文件&#xff0c;或者word&#xff0c;Java文件的后缀名是.java 新建Hello.java文件 // 输入Java代码public class Hello{public static void main(String[…

Vue3 小兔鲜:Pinia入门

Vue3 小兔鲜&#xff1a;Pinia入门 Date: May 11, 2023 Sum: Pinia概念、实现counter、getters、异步action、storeToRefs保持响应式解构 什么是Pinia Pinia 是 Vue 的专属状态管理库&#xff0c;可以实现跨组件或页面共享状态&#xff0c;是 vuex 状态管理工具的替代品&…

PHP7 连接数据库 MySQL8.0 报错 Call to undefined function mysqli_connect() 的解决方法

前提 如题所示使用的是PHP7的版本&#xff0c;连接MYSQL8.0数据库遇到的问题&#xff0c;提供我个人的解决办法。 我的报错是&#xff1a;Call to undefined function mysqli_connect() 首先明确 保证PHP与MySQL可以正常使用 访问localhost:80【或者你设置的端口号】是有页面…

shell编程之SNAT与DNAT的应用

SNAT与DNAT的应用 一、SNAT的介绍1.SNAT概述2.SNAT源地址转换过程二、SNAT转换 三、DNAT的介绍1.DNAT概述2.DNAT转换前提条件 四、DNAT的转换五、防火墙规则的备份和还原六、tcpdump抓包工具的运用 一、SNAT的介绍 SNAT&#xff08;SNAT&#xff09;一般指源地址转换 1.SNAT概…