leetcode 877石ゲーム

件名の説明:

アレックス・リーは、ゲーム内のいくつかの石でヒープ。行スタックに石を偶数、各スタックは、[i]は、正の整数石片山を有しています。

誰が勝者を決定するための最も石でゲームを持っています。石の合計数には引き分けがない、奇妙です。

アレックスとリーはターン、アレックス最初のスタートを取ります。各ターンでは、プレイヤーは、行の先頭や末尾から石の全体の杭を奪います。この状況は、石の勝利の手のどの時点ほとんどで、これ以上の石の山まで続きました。

アレックス・リーの前提と最高レベルのプレーは、アレックスがゲームに勝利する場合、trueを返すリーは試合に勝つためにする場合はfalseを返します。

 

例:

入力:[5,3,4,5]
出力:真の
説明:
アレックスが最初に起動し、わずか5または5の後に石を取る前に。
彼は5の前に取ったと仮定し、この行は[3,4,5]となります。
リーは3を取った前に、そして残りは[4,5]であれば、アレックスは10分後に5勝を取りました。
離れたリーは、その後、残りは[3,4]である場合には、図5に示すように、アレックスは9分後に4勝を取りました。
これは、前者はアレックスが動くの勝利で5石を取ることを示唆しているので、私たちはtrueを返します。

 

アイデアの分析:

ゲームは問題です。両側は、スマート十分な人々なので、貪欲の直接の使用は認められませんので。

我々は、動的ソルバーを使用する必要があります。DP [I] [J] [0]を示し、i番目、j番目のスタックのスタック石には、ちょうど石の最大数を取得する場合があります。DP [i] [j]は、[1]フリップを示しています。状態遷移方程式は、DPである[I] [J] [0] = MAX(パイル[I] + DP [I + 1] [j] [1]、杭[J] + DP [I]、[J-1] [1])、ヘッド手が左端の選択は、DP [I] [J] [1] DPを= [I + 1] [j] [0];右端、DP [I] [j]を選択するヘッド手[1] = DP [I]、[J-1] [0]。ここで、上部手と半分は、従って更新が交互に印加される相対的です。

 

コード:

クラスソリューション{ 
パブリック:
    BOOL stoneGame(ベクトル<整数>&パイル){ 
        int型N = piles.size()。
        INT DP [N] [N] [2] = {0}。
        (; iがN <I ++は、I = 0 INT)のために
        { 
            DP [I] [i]が[0] =杭[I]。
            DP [I] [I] [1] = 0。
        } 
        のために(int型、L = 1であり; n L <; L ++)
        { 
            ため(; iがn L <+; I = 0 int型私は++)
            { 
                int型J = L + iは、
                INT左=杭[I] + DP [I + 1] [j] [1]。
                右=杭[J] + DPをINT [I]、[J-1] [1]。
                IF(左>右)
                { 
                    DP [I] [J] [0] =左。
                    DP [I] [J] [1] DP [I + 1] [j] [0] =。
                } 
                { 
                    DP [I] [J] [0] =右。
                    DP [I] [J] [1] = DP [I]、[J-1] [0]。
                } 
            } 
        } 
        戻りDP [0]〜[N-1] [0] -dp [0]〜[N-1] [1]> 0。
    } 
}。

 

おすすめ

転載: www.cnblogs.com/LJ-LJ/p/11365415.html