力扣 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月09日 02时52分38秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Creative Tim
2019-04-26
再来 20 个免费的 Bootstrap 的后台管理模板
2019-04-26
DH-UAP(大华统一应用开发平台)开发简介
2019-04-26
IntelliJ IDEA WINDOWS & LINUX KEYMAP
2019-04-26
angular实现简单的pagination分页组件
2019-04-26
50个最新漂亮的国外网站模板下载
2019-04-26
Angular UI 组件
2019-04-26
angular好用的插件集合(持续更新中)
2019-04-26
Angular集成BizPage模板
2019-04-26
Angular集成Summernote富文本控件
2019-04-26
程序员必须知道的几个Git代码托管平台2
2019-04-26
TortoiseGit报错:SSL certificate problem
2019-04-26
CAS Clients 集成 Spring Security
2019-04-26
Spring Security CAS认证
2019-04-26
CentOS查看磁盘空间
2019-04-26
Node Sass could not find a binding for your current environment: Windows 64-bit with Node.js 8.x
2019-04-26
CAS实现单点登录(SSO)经典完整教程
2019-04-26
CAS集成Spring Boot、Spring Security
2019-04-26