ここでのオリジナルタイトルリンク:https://leetcode.com/problems/stone-game/
トピック:
アレックス・リーは、石の山でゲームをプレイします。そこ列に配置された杭の偶数であり、各パイルは、石の正の整数を有します piles[i]
。
ゲームの目的は、ほとんどの石で終了することです。石の総数が奇数なので、全く関係がありません。
アレックスとリーはアレックスが最初に起動すると、ターンを取ります。各ターンでは、プレイヤーが最初または行のいずれかの端から石の全体の山を取ります。ほとんどの石の勝利で人をその時点で残って、それ以上の杭は、存在しなくなるまでこれが続きます。
アレックスとリーが最適にプレイすると仮定すると、返す True
アレックスがゲームに勝った場合にのみ。
例1:
入力:[5,3,4,5]
出力:真の
説明:
アレックスが最初に開始し、最初の5または最後の5取ることができ
、行が[3、4、5になるように、彼は、最初の5を取る発言を]。
リーが3を取る場合、ボードは[4,5]であり、アレックスは10ポイントで勝つために5を要します。
リーは最後の5を取る場合は、ボードがある[3、4]、およびアレックスは9ポイントで勝つために4を取ります。
これは、最初の5を服用すると、アレックスのための勝利の動きであることを示したので、私たちはtrueを返します。
注意:
2 <= piles.length <= 500
piles.length
でもあります。1 <= piles[i] <= 500
sum(piles)
奇数です。
ソリューション:
杭にも多数あります。
Aさんは、彼はどちらかのすべての奇数のインデックス杭、あるいはインデックス杭を選ぶことができ、最初に選択されます。
人は常に勝つ最初を選ぶこれにより、Aはより大きなものを選ぶことができます。
使用DP、DP [i] [j]はiのjは山積みする杭から最大の合計を意味します。DP [I + 1] [j]は、他のプレイヤーのターンであることから、[I + 1] [j]のDP - それは[i]を選択する杭のいずれかから得ることができました。DP [I] [J-1] - または山[j]を選びます。
時間計算:O(N ^ 2)。N = piles.length。
スペース:O(N ^ 2)。
ACのJava:
1 クラスソリューション{ 2 公共 ブール stoneGame(int型[]パイル){ 3 int型 N = piles.length。 4 INT [] [] DP = 新しい INT [N] [N]。 5 のための(int型、iがN <; I = 0 iが++ ){ 6 DP [i]は[I] = 杭[I]。 7 } 8 9 用(INTのサイズ= 1; nはサイズ<;サイズ++ ){ 10 のために(int型 i = 0; iは++; iがNサイズ<+ ){ 11 DP [I] [iが+サイズ] = Math.max(パイル[I] -dp [I + 1] [iが+サイズ]、杭は[iが+サイズ] -dp [I] [I +サイズ-1 ]) ; 12 } 13 } 14 15 戻り DP [0]〜[N-1]> 0 。 16 } 17 }