LeetCode 877ストーンゲーム

ここでのオリジナルタイトルリンク: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を返します。

注意:

  1. 2 <= piles.length <= 500
  2. piles.length でもあります。
  3. 1 <= piles[i] <= 500
  4. 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 }

 

おすすめ

転載: www.cnblogs.com/Dylan-Java-NYC/p/11434019.html