游戏摘要-石头堆的数目甚至是偶数,并且2位玩家中的每位交替轮流捡起一堆。石头的总和总是奇怪的,因此不能有平局。我们需要检查首先开始的玩家是否赢得了比赛。
我对以下代码有疑问,可以正常工作 此代码检查Play A(谁先走)是否赢得比赛 下面的代码计算((A捡到的石头的总和-B捡到的石头的总和)
问题是-代码(在代码if(parity == 0)下)如何计算总和。 我了解涉及到动态编程/递归,但是由于未在递归调用中传递总和-如何计算总和?
def stoneGame(self, piles:List[int]) -> bool :
N = len(piles)
@lru_cache(maxsize=None)
def dp(i, j):
if(i > j):
return 0
parity = (j - i +1) %2
if(parity == 0):
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
答案 0 :(得分:1)
让我们看看术语 piles [i] + dp(i + 1,j)和奇偶校验0。
下一步计算将为桩[i]-桩[i + 1] + dp(i + 2,j)或桩[i]-桩[j] + dp( i + 1,j -1)
因此,您可以观察如何根据条件来增加或减少桩阵列。
在基本情况下(i> j),计算如下:
桩[x1]-桩[x2] +桩[x3]-桩[x4] + ......
其中x1,x2,x3,x4是数组的不同索引。