LeetCode:877. 石遊び(python)

2130 ワード

LeetCode:877. 石遊び(python)
アレックスと李はいくつかの石でゲームをしています.偶数の石が1列に並んでいて、それぞれの石には正の整数の石pilesがある[i].
ゲームは誰の手の中の石が一番多いかで勝負を決める.石の総数は奇数なので引き分けはありません.
アレックスと李は交代で行い、アレックスは先に始めた.ラウンドごとに、プレイヤーは行の開始または終了から石の山全体を取り出します.このような状況は、より多くの石の山がないまで続き、この時、手にした石が最も多いプレイヤーが勝った.
アレックスと李が最高のレベルを発揮したと仮定し、アレックスが試合に勝ったときにtrueに戻り、李が試合に勝ったときfalseに戻る.
例:
入力:[5,3,4,5]出力:true解釈:アレックスは先に始まり、前の5つまたは後の5つの石しか持てない.彼が最初の5つを取ったと仮定すると、この行は[3,4,5]になった.李が前の3つを持っていくと、残りは[4,5]、アレックスが持って行った後の5つが10点を獲得した.李が後5個を持っていくと、残りは[3,4]、アレックスが後4個を持って9点を獲得した.これは、上位5つの石を取ることがアレックスにとって勝利の行動であることを示しているので、trueに戻ります.
ヒント:
2 <= piles.length <= 500
piles.length    。
1 <= piles[i] <= 500
sum(piles)    。

LeetCodeリンク
分析:この問題の最初の構想とLeetCode:486.予測勝者(python)は同じで、ここでは説明しないで、ステップを移動して表示できます.
考え方:
  • 石の積載数nが偶数であれば、先手は実際に自分と逆手で選んだ石の積載をある程度制御することができる.
  • 例1:n=2、インデックス1~2先手は第1の山を選択することができて、逆手は第2の山しか選択できません;先手は2番目の山を選択でき、逆手は1番目の山しか選択できない.
  • 例2:n=4、インデックス1~4先手は第1山を選び、逆手は第2または第4山しか選ばない.先手は続いて3番目の山を選択し、反対手は4番目の山または2番目の山を選択します.先手は4番目の山を選び、逆手は1番目か3番目の山しか選ばない.先手は2番目の山を選択し、反対手は3番目の山または1番目の山を選択します.
  • 例n:n=偶数、インデックス1~n先手は優位性を通じて または に選択することができる.

  • はまた石の総数が奇数であるため、 > または > は必然的に発生し、先手は積数が偶数の場合、優勢によって の中の大きい者を選ぶことができるので、必ず後手に勝つ.

  • 付属コード(Python 3):
    class Solution:
        def stoneGame(self, piles):
            return True
    

    まとめ:
    以上の解題の構想は強い数学能力が必要で、あるいは少し知能の問題の意味があります.この解題案も で、思いついたことはまだしも、正直に動的計画を勉強したほうが妥当だとは思わなかった.
    参照先:
    LeetCode問題解