[Leetcode][Python] Stone Game I,II,III,IV总结
Stone Game I
题目链接:https://leetcode.com/problems/stone-game/
题目解析:DP问题
dp[i][j]: 从第i个石头到第 j 即 (i+l-1)个石头之间最大的对手得分差。
Alex取piles[i]时,Lee也保持最佳状态从[ i+1, j ]中取值
Alex取piles[j]时,Lee也保持最佳状态从[ i, j+1 ]中取值
代码
def stoneGame(piles) -> bool:
n = len(piles)
dp = [[0 for i in range(n)] for j in range(n)]
for i in range(n):
dp[i][i] = piles[i]
for l in range(2,n+1): # subproblem with length [2,n]
for i in range(n-l+1):
j = i + l -1
dp[i][j]=max(piles[i]-dp[i+1][j],piles[j]-dp[i][j-1])
return dp[0][n-1] > 0
Stone Game IV
题目链接:https://leetcode.com/problems/stone-game-iv/
题目解析:DP问题
举例:
i=1,Alice拿1,获胜。
i=2,Alice拿1,dp[2-1] 先拿者获胜,Bob获胜,Alice输。
i=3,Alice拿1,dp[3-1] 先拿者输,Bob输,Alice获胜。
i=4,Alice拿4,Alice获胜。
i=5,Alice拿4,dp[5-1]或者dp[5-4]先拿者胜,Alice输。
以此类推…
代码
class Solution(object):
def winnerSquareGame(self, n):
"""
:type n: int
:rtype: bool
"""
dp = [False] * (n + 1)
for i in range(1, n + 1):
for j in range(1, int(i ** 0.5 + 1)):
if not dp[i - j * j]:
dp[i] = 1
break
return dp[n]