葉值的最小代價生成樹 c 解題思路

2021-10-07 07:21:01 字數 1879 閱讀 5899

#####思路:遞迴,暴力求解

#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中找出...