问题描述: 小M在玩一款弹子游戏机,目标是在给定版面布局中获得最高分数。版面由钉子(-1,会改变弹珠方向)和得分点(非负整数,弹珠经过时得分)组成,空位置(0)则让弹珠直接下落。版面高度为n,宽度为m,以n x m二维数组表示。小M想知道在任意上方位置放置弹珠,能获得的最高分数是多少。
代码实现:
def solution(n, m, array):
# Edit your code here
a=[[]]
def recursive(row,col):
if(row==n-1):
if(array[row][col]==-1):
return 0
else:
return array[row][col]
elif(array[row][col]>=0):
print(row,col)
return array[row][col]+recursive(row+1,col)
elif(array[row][col]==-1):
if(col==0):
return recursive(row+1,col+1)
elif(col==m-1):
print(row,col)
return recursive(row+1,col-1)
else:
print(row,col)
return max(recursive(row+1,col+1),recursive(row+1,col-1))
result=0
for i in range(m):
temp=recursive(0,i)
if(result<temp):
result=temp
print(result)
return result
代码思路:
- 定义一个递归函数
recursive(row, col),该函数用于计算从当前行row和列col开始,能够获得的最高分数。 - 在递归函数中,首先检查是否到达了版面的底部(即
row == n-1),如果是,则根据当前格子的内容返回相应的分数或者0。 - 如果当前格子是得分点(即
array[row][col] >= 0),则将该得分点分数加上从下一行同一列继续递归得到的分数。 - 如果当前格子是钉子(即
array[row][col] == -1),则需要根据弹珠的弹射规则,递归计算弹珠弹射到左下和右下位置能够获得的最高分数,并返回两者的最大值。 - 如果当前格子为空(即
array[row][col] == 0),则弹珠直接下落,继续递归计算下一行的同一列。 - 在主函数
solution中,遍历版面最上方的每一列,调用递归函数recursive计算从该列开始能够获得的最高分数,并更新结果result。 - 最后,返回
result作为能够获得的最高分数。
代码的改进和优化: 我们可以使用记忆化搜索来优化。具体方法是,新建一个二维数组m,存储每个位置已经计算过的分数。在需要某位置的分数时,直接从数组m中查找。如果查找不到、再调用递归进行计算、计算过后存储到数组m中。使用这种方法可以避免重复计算,提高算法的效率。这种方法称为记忆化搜索。