ストーンゲームII

説明

石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を返します。
        
    }
}

  

おすすめ

転載: www.cnblogs.com/FLAGyuri/p/12078341.html