蓝桥杯 ALGO-1006 拿金币 动态规划 双解法 python

但是我们看一下上图可以发现,有很多位置重复走过了(比如说(1,1),(2,1),(1,2)),走过的路就没必要再走一遍了,我们可以使用标记数组将记录走过位置以实现剪枝,提高执行效率。

现在我们看一下代码实现:

def dfs(x,y):

n行n列范围外的位置没有意义,结束递归

if x > n-1 or y > n-1:

return 0

走到终点位置后将终点位置的金币返回

if x == n-1 and y == n-1:

return nums[x][y]

如果这个位置没有走过就记录起来,下次再走到同样位置可提前返回结果

if not used[x][y]:

看往下走能拿金币多还是往右走,哪拿得多就走哪,

然后再将这个位置的金币数加上

那么经过几层递归后可以得到从该位置走到终点最大金币数

used[x][y] = max(dfs(x+1,y),dfs(x,y+1)) + nums[x][y]

return used[x][y]

n = int(input())

nums = []

for i in range(n):

nums.append(list(map(int,input().split())))

定义标记数组

used =

你可能感兴趣的:(程序员,蓝桥杯,动态规划,python)