Python实现石头游戏中最大得分程序
假设有一排石头,每块石头都有一个关联数字,这些数字存储在一个数组`stoneValue`中。在每一轮中,阿马尔将这排石头分成两部分,然后比马尔计算每一部分的值(该部分中所有石头的值的总和)。比马尔丢弃值最大的部分,阿马尔的得分增加剩余部分的值。当两部分的值相同时,比马尔让阿马尔决定丢弃哪一部分。下一轮以剩余部分开始。当只剩下一块石头时,游戏结束。我们需要找到阿马尔可以获得的最大得分。
因此,如果输入类似于`stoneValue = [7,3,4,5,6,6]`,则输出为:
第一轮,阿马尔将这一排石头分成两部分:[7,3,4],[5,6,6]。左边部分的总和是14,右边部分的总和是17。比马尔丢弃右边部分,阿马尔的得分现在是14。
第二轮,阿马尔将这一排石头分成两部分:[7],[3,4]。比马尔丢弃左边部分,阿马尔的得分变为(14 + 7) = 21。
第三轮,阿马尔只有一次选择来划分这一排石头,即[3],[4]。比马尔丢弃右边部分,阿马尔的得分现在是(21 + 3) = 24。
为了解决这个问题,我们将遵循以下步骤:
定义一个函数`dfs()`。它将接收起始位置`start`和结束位置`end`。
如果`start >= end`,则
返回0
`max_score := 0`
对于`cut`从`start`到`end`的范围,执行以下操作:
`sum1 := partial_sum[start, cut]`
`sum2 := partial_sum[cut+1, end]`
如果`sum1 > sum2`,则
`score := sum2 + dfs(cut+1, end)`
否则,如果`sum1 < sum2`,则
`score := sum1 + dfs(start, cut)`
否则,
`score := sum1 + max(dfs(start, cut), dfs(cut+1, end))`
`max_score := max(score, max_score)`
返回`max_score`
定义一个函数`getPartialSum()`。它将接收
对于`i`从0到`n - 1`的范围,执行以下操作:
`partial_sum[i, i] := stoneValue[i]`
对于`i`从0到`n - 1`的范围,执行以下操作:
对于`j`从`i+1`到`n - 1`的范围,执行以下操作:
`partial_sum[i, j] := partial_sum[i, j-1] + stoneValue[j]`
在主方法中,执行以下操作:
`n := stoneValue`的大小
`partial_sum :=`一个大小为n x n的二维数组,并填充为0
`getPartialSum()`
返回`dfs(0, n-1)`
示例
让我们看看下面的实现以更好地理解
def solve(stoneValue): def dfs(start, end): if start >= end: return 0 max_score = 0 for cut in range(start, end): sum1 = partial_sum[start][cut] sum2 = partial_sum[cut+1][end] if sum1 > sum2: score = sum2+dfs(cut+1, end) elif sum1 < sum2: score = sum1+dfs(start, cut) else: score = sum1+max(dfs(start, cut), dfs(cut+1, end)) max_score = max(score, max_score) return max_score def getPartialSum(): for i in range(n): partial_sum[i][i] = stoneValue[i] for i in range(n): for j in range(i+1, n): partial_sum[i][j] = partial_sum[i][j-1]+stoneValue[j] n = len(stoneValue) partial_sum = [[0]*n for _ in range(n)] getPartialSum() return dfs(0, n-1) stoneValue = [7,3,4,5,6,6] print(solve(stoneValue))
输入
[7,3,4,5,6,6]
输出
0