スパニングツリーを最小のコストがLeetCode1130値を残し[スウィフト] |。リーフ値から最小コストツリー

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
]➤[マイクロチャンネル公共数:シャンウィングチー( 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 }

 

おすすめ

転載: www.cnblogs.com/strengthen/p/11223721.html