Stone Game(Leetcode 877)-如何计算总和

时间:2019-06-17 01:05:31

标签: python-3.x recursion dynamic-programming

游戏摘要-石头堆的数目甚至是偶数,并且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

1 个答案:

答案 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是数组的不同索引。