LeetCode 1130. 叶值的最小代价生成树(区间DP/单调栈贪心)
文章目录
- 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/单调栈贪心)相关推荐
- leetcode算法题--叶值的最小代价生成树
原题链接:https://leetcode-cn.com/problems/minimum-cost-tree-from-leaf-values/ 相关问题:矩阵连乘.多边形三角剖分的最低得分 动态规 ...
- 最小代价(区间dp)(ybtoj)
文章目录 题目描述 解析 代码 题目描述 解析 (我觉得)很难的dp 思路是真的没有想出来 关键在于dp的设计: dp[l][r]:[l,r]的最小价值 f[l][r][a][b]:把l到r之间除了数 ...
- LeetCode 1039. 多边形三角剖分的最低得分(区间DP)
文章目录 1. 题目 2. 解题 1. 题目 给定 N,想象一个凸 N 边多边形,其顶点按顺时针顺序依次标记为 A[0], A[i], ..., A[N-1]. 假设您将多边形剖分为 N-2 个三角形 ...
- 最小代价生成树Prim/Kruskal(c/c++)
常用的求最小代价生成树的方法有两种:Prim算法和Kruskal算法,这两种算法都是贪心算法的应用, Prim算法 在一个无向带权图中求得最小生成树得思路是:从a顶点出发,将a放入u集合(表示已选), ...
- TZOJ 5471: 数据结构实验--图的最小代价生成树
题目描述 求带权无向图的最小代价生成树. 输入 输入数据为多组,每组数据包含多行,第一行为2个整数n,e,n为图的顶点数,e为边数,接下来是e行,每行3个整数,前两个整数是一个顶点对,代表一条边所依附 ...
- LeetCode 1278. 分割回文串 III(区间DP)
文章目录 1. 题目 2. 解题 1. 题目 给你一个由小写字母组成的字符串 s,和一个整数 k. 请你按下面的要求分割字符串: 首先,你可以将 s 中的部分字符修改为其他的小写英文字母. 接着,你需 ...
- LeetCode 1000. 合并石头的最低成本(区间DP)
文章目录 1. 题目 2. 解题 1. 题目 有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆 ...
- leetcode 239. Sliding Window Maximum | 239. 滑动窗口最大值(单调栈,窗口内最大最小值更新结构)
题目 https://leetcode.com/problems/sliding-window-maximum/ 题解 窗口内最大最小值更新结构,单调栈问题,左神视频讲过,<程序员算法面试指南& ...
- leetcode 435. Non-overlapping Intervals | 435. 无重叠区间(单调栈)
题目 https://leetcode.com/problems/non-overlapping-intervals/ 题解 我一开始是没有 get 到这道题的精髓的.只是在想,用贪心法,当两个 (a ...
最新文章
- spring 事务 对象保存之后,修改的时候,自动更新提交?
- JS 二级菜单栏的tab切换
- 浅谈js数据类型识别方法
- 在NAnt中加入Vssget 任务
- 在java中添加源_关于Java:如何在Android Studio中添加链接的源文件夹?
- 进制转换练习-其它进制转换为十进制
- 明年Wi-Fi手机销量5亿 无线技术助移动互联网爆发
- 一个action类中写多个方法需要继承MappingDispatchAction
- 安卓java游戏模拟器_java游戏模拟器安卓版下载
- 计算平均指令时间_欧姆龙PLC指令应用案例
- navicat和mysql有必要都装吗_MySQL基本介绍及Navicat安装
- MATLAB指纹识别算法实现
- DSPE-PEG7-Mal新研博美 小分子PEG的循环节可以做到1-36个
- 网校装修,定义您的专属风格!
- 猴子选大王(python)
- ubuntu 检测网络状态命令
- C语言使用字符串处理函数
- 帮助你快速懂得心算十进制转二进制。(理解就会)
- PHP各大音乐平台API接口下载,PHP各大音乐平台API接口
- VR开发 入门 使用Three.js 开发的WebVR demo