在Python中找到石头游戏得分最小差异的程序

在Python中找到石头游戏得分最小差异的程序

假设我们有一个名为stones的数组,其中stones [i]表示左侧第i个石头的价值。两个朋友Amal和Bimal玩带回合制的游戏,并且Amal总是先手。一排中有n个石头。每个玩家可以从行中移除最左边或最右边的石头,并获得等于行中剩余石头价值之和的点数。谁的分数更高将获胜。现在,Bimal发现他总是会输掉这个游戏,因此他决定最小化分数的差异。Amal的目标是最大化得分差异。因此,如果他们都操作最佳,我们必须找到Amal和Bimal的得分差异。

因此,如果输入为stones = [6,4,2,5,3],那么输出将为6,因为Amal可以取3,因此他的得分将是6 + 4 + 2 + 5 = 17,Bimal的得分到目前为止为0,数组如下[6,4,2,5],然后Bimal取6,因此他的得分为4+2+5 = 11,现在数组为[4,2,5],然后Amal移除4,所以他的得分为17+2+5 = 24,石头数组为[2,5],Bob移除2,因此他的得分为11+5 = 16,当前石头数组为[5],Amal去掉价值为5的最后一块石头,并获得0分,因此他的最终得分为24 + 0 = 24。因此,他们的分数差为24 – 16 = 8。

为了解决这个问题,我们将按照以下步骤进行 –

  • n:石头的大小
  • dp:大小为n的数组,填充为0
  • 对于i在n-1到0的范围内,递减1,做以下操作
    • v:= stones [i]
    • run_sum:= 0
    • 对于j在i + 1到n-1的范围内,做以下操作
      • new_run:= run_sum + stones[j]
      • dp [j]:=(new_run-dp [j])和(run_sum + v-dp [j-1])的最大值
      • run_sum:= new_run
  • 返回dp [n-1]

例子

让我们看一下以下实现,以更好地理解-

def solve(stones):
     n = len(stones)
     dp = [0] * n

     for i in range(n - 1, -1, -1):
        v = stones[i]
        run_sum = 0

        for j in range(i + 1, n):
            new_run = run_sum+stones[j]
            dp[j] = max(new_run - dp[j], run_sum+v - dp[j - 1])
            run_sum = new_run
     return dp[n - 1]

stones = [6,4,2,5,3]
print(solve(stones))

输入

[6,4,2,5,3]

输出

8

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程