件名の説明:
アレックス・リーは、ゲーム内のいくつかの石でヒープ。行スタックに石を偶数、各スタックは、[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。 } }。