力扣 1130. 叶值的最小代价生成树 区间dp/单调栈
发布日期:2021-11-05 06:59:29 浏览次数:14 分类:技术文章

本文共 1395 字,大约阅读时间需要 4 分钟。

在这里插入图片描述
思路一:区间 d p dp dp d p [ i ] [ j ] dp[i][j] dp[i][j]表示合并 [ i , j ] [i,j] [i,j]所能得到的二叉树中非叶节点总和最小的值。枚举断点 k k k,表示我们先分别合并 [ i , k ] [i,k] [i,k] [ k + 1 , j ] [k+1,j] [k+1,j],再合并它们,那么有: d p [ i ] [ j ] = m i n ( d p [ i ] [ j ] , d p [ i ] [ k ] + d p [ k + 1 ] [ j ] + M a x [ i ] [ k ] ∗ M a x [ k + 1 ] [ j ] ) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+Max[i][k]*Max[k+1][j]) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+Max[i][k]Max[k+1][j])

class Solution {
public: int mctFromLeafValues(vector
& arr) {
int siz=arr.size(); if(!siz) return 0; vector
> MAX(siz,vector
(siz)); vector
> dp(siz,vector
(siz,0x3f3f3f3f)); for(int i=0;i

思路二:单调栈。这个有点难想,看了别人的题解才学到。

在这里插入图片描述

class Solution {
public: int mctFromLeafValues(vector
& arr) {
stack
s; int siz=arr.size(),ans=0; for(int i=0;i
=s.top()){
int tmp=s.top(); s.pop(); if(s.empty()) ans+=tmp*arr[i]; else ans+=tmp*min(arr[i],s.top()); } s.push(arr[i]); } while(s.size()>=2){
int tmp=s.top(); s.pop(); ans+=tmp*s.top(); } return ans; }};

转载地址:https://blog.csdn.net/xiji333/article/details/107955045 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:力扣 856. 括号的分数 递归/栈/数学
下一篇:力扣 341. 扁平化嵌套列表迭代器 递归/栈/python 生成器

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月09日 02时52分38秒