小偷在迷宫中

时间:2018-08-25 06:47:15

标签: python dynamic-programming

我有一个专心致志的问题:

我们有一个贼,能量为k,迷宫(n x m)的值矩阵为自然数。因此,小偷从左上角开始,然后下降。很明显,他的目标是尽自己最大的努力来偷窃。他的每一步都使用1单位能量。

他可以通过两种方式移动:

  1. 他可以向右走一步
  2. 他可以跳到下一行的第一列

(因此,他从“左侧”偷走了每一行。)

当他的能量耗尽时,他退出了迷宫(我认为他可以在终点线以外的其他地方跳出迷宫)。

例如,我了解迷宫中的一只老鼠(老鼠吃了尽可能多的奶酪),但我不知道如何在其中添加能量。

如何为这个问题写递归方程?

是否有DP解决方案(即通过矩阵操作)?

2 个答案:

答案 0 :(得分:1)

以下递归函数将在行列元组列表中输出具有最大可能掠夺的元组和实现该路径的路径:

def steal(maze, energy, row=0, column=0):
    if energy <= 0 or row >= len(maze) or column >= len(maze[row]):
        return 0, []
    loot, path = max(
        steal(maze, energy - 1, row, column + 1),
        steal(maze, energy - 1, row + 1, 0)
    )
    return maze[row][column] + loot, [(row, column)] + path

例如:

m = [
    [2, 8, 3],
    [6, 5, 1],
    [9, 4, 7]
]
print(steal(m, 5))

将输出:

(30, [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0)])

答案 1 :(得分:0)

此问题在某些方面类似于背包问题。您可以通过dp或递归解决它。 查看this链接,它将使您对这个问题有更好的了解。 您的问题有些不同,但逻辑是相同的。