#####思路:遞迴,暴力求解
結果:超時了,原因應該是遞迴層次太多導致的。#include
#include
#include
using
namespace std;
intmctfromleafvalues
(vector<
int>
& arr)
if(len ==2)
int result = int32_max;
//根據索引i將arr分為左右兩個部分
for(
int i=
1;i)return result;
}int
main()
思路:記錄中間的計算結果
**
#include
#include
#include
using
namespace std;
intsolution
(vector<
int> arr,
int left,
int right, vectorint>
>
& record)
//只有兩個節點的情況
if(left == right-1)
//如果record[left][right]之前已經計算出結果,直接返回
if(record[left]
[right]!=0
)int result = int32_max;
//講arr[left][right]再分為左右兩個部分
for(
int i = right;i>left;i--
)//record[left][i-1]之前未計算出來,則計算
if(record[left]
[i-1]==
0)//leftmaxleafvalue為左子樹中最大的葉子節點的值
int leftmaxleafvalue =*(
max_element
(arr.
begin()
+left, arr.
begin()
+i))
;//rightmaxleafvalue為右子樹中最大的葉子節點的值
int rightmaxleafvalue =*(
max_element
(arr.
begin()
+i, arr.
begin()
+right+1)
);//更新result
if(result > record[left]
[i-1
]+ record[i]
[right]
+ leftmaxleafvalue * rightmaxleafvalue)
}//記錄record[left][right]的值
record[left]
[right]
= result;
return record[left]
[right];}
intmctfromleafvalues
(vector<
int>
& arr)
vectorint>
>
record
(len, vector<
int>
(len,0)
);//vector[i][j]記錄arr[i][j]的最小的非葉子節點之和
return
solution
(arr,
0, len-
1, record);}
intmain()
leetcode 葉值的最小代價生成樹
給你乙個正整數陣列 arr,考慮所有滿足以下條件的二叉樹 每個節點都有 0 個或是 2 個子節點。陣列 arr 中的值與樹的中序遍歷中每個葉節點的值一一對應。知識回顧 如果乙個節點有 0 個子節點,那麼該節點為葉節點。每個非葉節點的值等於其左子樹和右子樹中葉節點的最大值的乘積。在所有這樣的二叉樹中,...
最小生成樹解題思路
最小生成樹 乙個有 n 個結點的連通圖的生成樹是原圖的極小連通子圖,且包含原圖中的所有 n 個結點,並且有保持圖連通的最少的邊。最小生成樹可 以用kruskal 克魯斯卡爾 演算法或prim 普里姆 演算法求出。思路 1.審題,把題目要求的邊都篩選出來 2.對邊排序 3.用並查集連邊 4.判斷有幾根...
貪心法 C語言實現最小代價生成樹
最小代價生成樹 無向連通圖g 含n個頂點 若g存在由n 1條邊連通n個頂點的子圖g 則稱g 為g的一棵生成樹。若g的每一條邊都賦了乙個權值,則稱此圖為網路。最小代價生成樹 在乙個網路的各種生成樹中,具有最小代價的生成樹。普里姆演算法 設網路g v 設u為v的子集 初始u為空集 然後從集合v u中找出...