第三十六天(极小化极大)
# 高阶函数
from functools import lru_cache
class Solution:
def stoneGame(self, piles):
N = len(piles)
# last recently unused,缓存,None表示无限制
@lru_cache(None)
def dp(i, j):
# The value of the game [piles[i], piles[i+1], ..., piles[j]].
if i > j: return 0
parity = (j - i) % 2 # 判断是否是亚历克斯(先手)
if parity == 1: # first player
return max(piles[i] + dp(i+1,j), piles[j] + dp(i,j-1)) # 越大,越能获胜
else:
return min(-piles[i] + dp(i+1,j), -piles[j] + dp(i,j-1)) # 越小,越能减少对手获得的分数
return dp(0, N - 1) > 0最后更新于