説明
石game.Atは、ゲームプレーヤーのピックn個の石の山の始まりがあります in a circle
。
目標は、次の規則を観察する1つの山に石をマージすることです。
ゲームの各ステップでは、プレイヤーは新しい山に隣接する二つの山をマージすることができます。
スコアは、新たな山で石の数です。
あなたは合計スコアの最小値を決定することです。
例
例1:
Input:
[1,1,4,4]
Output:18
Explanation:
1. Merge second and third piles => [2, 4, 4], score +2
2. Merge the first two piles => [6, 4],score +6
3. Merge the last two piles => [10], score +10
例2:
Input: [1, 1, 1, 1] Output:8 Explanation: 1. Merge first and second piles => [2, 1, 1], score +2 2. Merge the last two piles => [2, 2],score +2 3. Merge the last two piles => [4], score +4
アイデア:動的計画。
DP [I] [J]代表はiからjまでの合併は、最小のコストです。
転写式DP [I] [J] =分(DP [I] [K] + DP [K + 1]〜[J] +和[J + 1] -和[i])と
パブリッククラスソリューション{ / ** * @paramのA整数配列 * @return整数 * / 公共INT stoneGame2(INT [] A){ //ここにコードを書きます INT、N = A.length。 IF(N <= 1) 0を返します。 INT [] [] DP =新しいINT [2 * N] [2 * N]。 INT []和は=新しいINT [2 * N + 1]。 {(; I <= 2 * N ++ I INT iは= 1)のための 和[I] =和[I - 1] + A [(I - 1)%N]。 } {(; I <2 * N ++ I INTがI = 0)するため DP [i]は[I] = 0; } 用(= 2のみしか<= 2 * N; ++のみ) 以下のために(INT I 0 =; I <2 * N && I + LEN - 1 <2 * N; ++ I){ int型J = + LEN - 1。 DP [I] [J] = Integer.MAX_VALUEの; {(++ K; K <J int型K = i)に対する IF(DP [I] [K] + DP [K + 1]〜[J] +和[J + 1] - 和[I] <DP [I] [J]) DP [I] [J] = DP [I] [K] + DP [K + 1]〜[J] +和[J + 1] - 和[I]; } } int型ANS = Integer.MAX_VALUEで、 (++ I; I <N I = 0の整数)のために IF(DP [I] [I + N - 1] <ANS) ANS = DP [I] [I + N - 1]。 ANSを返します。 } }