★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
]➤[マイクロチャンネル公共数:シャンウィングチー( shanqingyongzhi)
➤ブログパークアドレス:サンチンウィングチー(https://www.cnblogs.com/strengthen/)
➤GitHubアドレス:https://github.com/strengthen/LeetCode
元のアドレス➤:HTTPS:// WWW。 cnblogs.com/strengthen/p/11223721.html
リンクはブログチーウィンシャンパークアドレスではない場合➤、それは記事の著者をクロールすることができます。
➤テキストは、更新を変更されました!元のアドレスが読むことを強く推奨クリック!サポート作者!オリジナルをサポートしています!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
配列を指定して arr
正の整数の、すべてのバイナリツリーように考えてみます。
- 各ノードは、0または2人の子供を持っています。
- 値は、
arr
ツリーの中の順序トラバーサル各葉の値に対応します。 (ノードが葉の場合にのみ、それは0人の子供を持っている場合であることを思い出してください。) - 各非リーフノードの値は、それぞれ、その左右のサブツリー内の最大葉値の積に等しいです。
考慮されるすべての可能なバイナリツリーの中で、各非リーフノードの値の最小の可能な和を返します。この合計が32ビット整数に収まることが保証されます。
例1:
入力:ARR = [6,2,4] 出力:32 説明: 2本の可能な木があります。最初は、非リーフノード和36を有し、第2の非リーフノードの和を有する32 24 24 / \ / \ 12 4 6 8 / \ / \ 6 2 2 4
制約:
2 <= arr.length <= 40
1 <= arr[i] <= 15
- 答えは32ビット符号付き整数に収まることが保証されている(すなわち。それはより少ないです
2^31
)。
あなたの正の整数配列を与えるには arr
、次のすべての条件にバイナリツリーを考えてみます。
- 各ノードは、子ノード0又は2を有しています。
- アレイ
arr
の各リーフノード対応の中央値のツリーのトラバースINORDER。(ナレッジレビュー:ノードに子ノードがある場合は0が、その後ノードがリーフノードです。) - 各非リーフノードの値は、左サブツリーの右の部分木の最大値と葉ノードとの積に等しいです。
このようなすべてのバイナリツリーでは、各非リーフノードの和の最小可能値を返します。この値は32ビット整数です。
例:
入力:= [6,2,4] ARR 32:出力 説明: 二つの可能なツリーがあり、最初の非リーフノードの合計が36、第二の非リーフノード32の合計です。 24 24 / \ / \ 12468 / \ / \ 6224
ヒント:
2 <= arr.length <= 40
1 <= arr[i] <= 15
- 答えはすなわち未満、32ビット符号付き整数を確保することです
2^31
。
ランタイム:36ミリ
メモリ使用率:20.9メガバイト
1 クラスソリューション{ 2 FUNC mctFromLeafValues(_ ARR:[INT]) - > のInt { 3 VARの DP:[INT]] = [[INT]](繰り返し:[INT](繰り返し:0、カウント:45)、カウント:45 ) 4 VARの MAXN:[INT]] = [[INT]](繰り返し:[INT](繰り返し:0、カウント:45)、カウント:45 ) 5 VARの N:intは= arr.count 6 ため I で 0 <.. N 7 { 8 MAXN [i]は[I] = ARR [I] 9 用 J における(I + 1).. < N 10 { 11 - MAXN [I] [J] = MAX(MAXN [I] [J 1 、ARR [J]) 12 } 13 } 14 のための D で 2 。 ..n 15 { 16 VAR I:のInt = 0 17 ながら(iは+ D - 1 < N) 18 { 19 のvar Jます。int = iがD + - 1つの 20 DP [I] [J] =を(1 <<60 ) 21 のためのK における I .. < J 22 { 23 MAXN DP [I] [J] =分(DP [I]、[J]、[I] [K] * MAXN [K + 1 ] [J] + DP [I] [K] + DP [K + 1 ] [J]) 24 } 25 I + = 1 26 } 27 } 28 リターン(DP [ 0 ] [N - 1 ]) 29 } 30 }