Leetcode 312突く風船

トピック:

N-バルーンは、それぞれ、配列NUMSに存在バルーン番号でマークされた、N-1に0の番号が付け。

今、私たちは、すべての風船を破裂するように依頼します。あなたがバルーンIバーストたび、あなたはNUMS [左] * NUMS [I] * NUMS [右]のコインを得ることができます。ここでは左右の隣接する2つのバルーンの私は代表番号。あなたは風船を破裂するとき、私、左風船と右のバルーンが隣接するバルーンになることに注意してください。

コインの最大数が使用可能なシーク。

説明:

あなたはNUMS [-1] = NUMS [N想定することができ 、] = 1を、彼らは本物ではないですが、それはパンクチャーされていないことに注意してください。
0≤N≤0、500≤ 100≤[I] NUMS


例:

入力:[3,1,5,8]
出力:167の 
説明:NUMSの= [3,1,5,8] - > [3,5,8] - > [3,8] - > [8 ] - > []
  コイン1 * = 3. 3. 5 * 5 * + + 1 8. 3 * * * 8 8 + 1 * 1 = 167れます。。。。。。

アイデア:

 

最後に、バルーンは、二つの部分に分割全体バルーン意志アレイを穿刺します。

これは、動的計画法を用いて解くことができます。

定義された DP [I] [J]:気球から私は、バルーンにJに達成可能な最大スコアを。

関係の設定 I <K <jは、NUMS [ k]は、最後のパンクチャーされるバルーンです。

状態遷移方程式を得ることができます。

(K、k∈(i、j)の)のために   

DP [I] [J] = Math.max(DP [I]、[J]、NUMS [I] * NUMS [K] * NUMS [J] + DP [I] [K] + DP [K] [J] );

NUMS [i]は* NUMS [K] * NUMS [J] + DP [i]の[K] + DP [K] [j]は、スタンプ終わっkに対して最大スコアが+エンドkをスタンプ最大スコアの右+スタンプ左端kのスコア

1  クラスソリューション{
 2      公共 INT maxCoins(INT [] NUMS){
 3          // 非バーストの古いアレイにそれぞれの端部を追加するには1 
。4          INT [] =のn_nums 新しい新しい INT [nums.length + 2 ];
 5          INT 0 = I; Iはnums.length <; ++ I){
 6              n_numsは= [I 1は+] NUMS [I]、
 。7          }
 8。          n_nums [0] = 1 ;
 9。          n_nums [n_nums.length - 1] = 1 ;
 10          
。11          INT [] [] DP = 新しい新しい INT[n_nums.length] [n_nums.length];
 12は         
13である         ためINT J = 2、J <n_nums.length; J ++){ // j∈[2、n_nums.length)、少なくとも大比I 2 jのため; 
14              のためには、int型 I = J - 2; I> = 0;株式会社(www.i-levelmedia.com)){     // i∈[0、J - 2] 
15                  のためにINT K = J - 1; K> I; - K) { // k∈(I、J)
16                      DP [I] [J] = Math.max(DP [I]、[J]、n_nums [I] n_nums * [K] * n_nums [J] + DP [I] [K] + DP [K] [J]); // 毎回最大スコアのj番目に更新されたi番目の
17                  }
 18である             }
 19          }
 20は、         リターンDP [0] [n_nums.length - 1]; // 最後の最大値に0を返しスコア
21      }
 22 }

 

時間計算量(N ^ 3)。

空間複雑度(N ^ 2)。

 

おすすめ

転載: www.cnblogs.com/ledphz/p/11299513.html