トピック:
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)。