文章目录

  • 1. 题目
  • 2. 解题
    • 2.1 DP
    • 2.2 单调栈贪心

1. 题目

给你一个正整数数组 arr,考虑所有满足以下条件的二叉树:

  • 每个节点都有 0 个或是 2 个子节点。
  • 数组 arr 中的值与树的中序遍历中每个叶节点的值一一对应。(知识回顾:如果一个节点有 0 个子节点,那么该节点为叶节点。)
  • 每个非叶节点的值等于其左子树和右子树中叶节点最大值的乘积

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

示例:
输入:arr = [6,2,4]
输出:32
解释:
有两种可能的树,
第一种的非叶节点的总和为 36,
第二种非叶节点的总和为 32。24            24/  \          /  \12   4        6    8/  \               / \
6    2             2   4提示:
2 <= arr.length <= 40
1 <= arr[i] <= 15
答案保证是一个 32 位带符号整数,即小于 2^31。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-cost-tree-from-leaf-values
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 DP

类似题目:
LeetCode 1039. 多边形三角剖分的最低得分(区间DP)

  • 区间DP,见注释
class Solution {public:int mctFromLeafValues(vector<int>& arr) {int n = arr.size();vector<vector<pair<int, int>>> dp(n, vector<pair<int, int>>(n, {INT_MAX, 0}));//dp[i][j] 表示区间 [i,j] 的 {非叶节点的min(sum), 区间的最大叶子节点值}for(int i = 0; i < n; i++) //初始化{dp[i][i].first = 0;//sumdp[i][i].second = arr[i];//maxval}for(int len = 1; len < n; ++len)//区间长度{for(int i = 0, j; i+len < n; ++i)//左端点{j = i+len;//右端点for(int k = i; k < j; ++k)//枚举中间端点{if(dp[i][j].first > dp[i][k].first+dp[k+1][j].first+dp[i][k].second*dp[k+1][j].second){                   //左区间的和 + 右区间的和 + 当前节点的val = maxL*maxRdp[i][j].first = dp[i][k].first+dp[k+1][j].first+dp[i][k].second*dp[k+1][j].second;//用更小的sum更新dp[i][j].second = max(dp[i][k].second, dp[k+1][j].second);// 更新区间的最大叶节点值}}}}return dp[0][n-1].first;}
};

16 ms 9.3 MB

2.2 单调栈贪心

  • 维护单调递减栈,让一个数字跟其相邻的2个数字中的较小的相乘
class Solution {public:int mctFromLeafValues(vector<int>& arr) {int n = arr.size(), tp, ans = 0;stack<int> stk;stk.push(INT_MAX);for(int a : arr){while(a >= stk.top())//单调递减栈,不满足了,弹栈{tp = stk.top();stk.pop();ans += tp*min(a, stk.top());}stk.push(a);}while(stk.size() > 2){tp = stk.top();stk.pop();ans += tp*stk.top();}return ans;}
};

0 ms 8.7 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 1130. 叶值的最小代价生成树(区间DP/单调栈贪心)相关推荐

  1. leetcode算法题--叶值的最小代价生成树

    原题链接:https://leetcode-cn.com/problems/minimum-cost-tree-from-leaf-values/ 相关问题:矩阵连乘.多边形三角剖分的最低得分 动态规 ...

  2. 最小代价(区间dp)(ybtoj)

    文章目录 题目描述 解析 代码 题目描述 解析 (我觉得)很难的dp 思路是真的没有想出来 关键在于dp的设计: dp[l][r]:[l,r]的最小价值 f[l][r][a][b]:把l到r之间除了数 ...

  3. LeetCode 1039. 多边形三角剖分的最低得分(区间DP)

    文章目录 1. 题目 2. 解题 1. 题目 给定 N,想象一个凸 N 边多边形,其顶点按顺时针顺序依次标记为 A[0], A[i], ..., A[N-1]. 假设您将多边形剖分为 N-2 个三角形 ...

  4. 最小代价生成树Prim/Kruskal(c/c++)

    常用的求最小代价生成树的方法有两种:Prim算法和Kruskal算法,这两种算法都是贪心算法的应用, Prim算法 在一个无向带权图中求得最小生成树得思路是:从a顶点出发,将a放入u集合(表示已选), ...

  5. TZOJ 5471: 数据结构实验--图的最小代价生成树

    题目描述 求带权无向图的最小代价生成树. 输入 输入数据为多组,每组数据包含多行,第一行为2个整数n,e,n为图的顶点数,e为边数,接下来是e行,每行3个整数,前两个整数是一个顶点对,代表一条边所依附 ...

  6. LeetCode 1278. 分割回文串 III(区间DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个由小写字母组成的字符串 s,和一个整数 k. 请你按下面的要求分割字符串: 首先,你可以将 s 中的部分字符修改为其他的小写英文字母. 接着,你需 ...

  7. LeetCode 1000. 合并石头的最低成本(区间DP)

    文章目录 1. 题目 2. 解题 1. 题目 有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆 ...

  8. leetcode 239. Sliding Window Maximum | 239. 滑动窗口最大值(单调栈,窗口内最大最小值更新结构)

    题目 https://leetcode.com/problems/sliding-window-maximum/ 题解 窗口内最大最小值更新结构,单调栈问题,左神视频讲过,<程序员算法面试指南& ...

  9. leetcode 435. Non-overlapping Intervals | 435. 无重叠区间(单调栈)

    题目 https://leetcode.com/problems/non-overlapping-intervals/ 题解 我一开始是没有 get 到这道题的精髓的.只是在想,用贪心法,当两个 (a ...

最新文章

  1. spring 事务 对象保存之后,修改的时候,自动更新提交?
  2. JS 二级菜单栏的tab切换
  3. 浅谈js数据类型识别方法
  4. 在NAnt中加入Vssget 任务
  5. 在java中添加源_关于Java:如何在Android Studio中添加链接的源文件夹?
  6. 进制转换练习-其它进制转换为十进制
  7. 明年Wi-Fi手机销量5亿 无线技术助移动互联网爆发
  8. 一个action类中写多个方法需要继承MappingDispatchAction
  9. 安卓java游戏模拟器_java游戏模拟器安卓版下载
  10. 计算平均指令时间_欧姆龙PLC指令应用案例
  11. navicat和mysql有必要都装吗_MySQL基本介绍及Navicat安装
  12. MATLAB指纹识别算法实现
  13. DSPE-PEG7-Mal新研博美 小分子PEG的循环节可以做到1-36个
  14. 网校装修,定义您的专属风格!
  15. 猴子选大王(python)
  16. ubuntu 检测网络状态命令
  17. C语言使用字符串处理函数
  18. 帮助你快速懂得心算十进制转二进制。(理解就会)
  19. PHP各大音乐平台API接口下载,PHP各大音乐平台API接口
  20. VR开发 入门 使用Three.js 开发的WebVR demo

热门文章

  1. viewsource和viewparsed_Network Panel说明
  2. input子系统基础之按键3——input子系统架构总览
  3. LC-BLSTM结构快速解读
  4. C++之Boost准标准库配置
  5. vue.js 四(指令和自定义指令)
  6. 这本轻小说真厉害 2016
  7. git 发布android 系统版本 修改版本型号 查看指定文件的修改记录
  8. 同事用void把我给秀翻了!
  9. 十分钟让你明白AIDL
  10. Linux的 i2c 驱动框架分析