Python 迷宫中的小偷

Python 迷宫中的小偷,python,dynamic-programming,Python,Dynamic Programming,我有一个练习有问题: 我们有一个能量为k的小偷和一个迷宫(nxm),它的值矩阵是自然数。于是小偷从左上角开始往下走。他的目标显然是用他的精力尽可能多地偷窃。他每走一步就消耗一个单位的能量 他可以用两种方式移动: 他可以向右走一步 他可以跳到下一行的第一列 (所以他在每一行“从左边”都偷东西。) 当他耗尽能量时,他会退出迷宫(我认为他可以在终点线以外的某条线上跳出迷宫) 例如,我了解迷宫中的老鼠(老鼠吃尽可能多的奶酪),但我不知道如何在这里包含能量 我怎样才能写出这个问题的递归方程 是否有DP解决

我有一个练习有问题:

我们有一个能量为k的小偷和一个迷宫(nxm),它的值矩阵是自然数。于是小偷从左上角开始往下走。他的目标显然是用他的精力尽可能多地偷窃。他每走一步就消耗一个单位的能量

他可以用两种方式移动:

  • 他可以向右走一步
  • 他可以跳到下一行的第一列
  • (所以他在每一行“从左边”都偷东西。)

    当他耗尽能量时,他会退出迷宫(我认为他可以在终点线以外的某条线上跳出迷宫)

    例如,我了解迷宫中的老鼠(老鼠吃尽可能多的奶酪),但我不知道如何在这里包含能量

    我怎样才能写出这个问题的递归方程


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

    以下递归函数将输出一个最大可能的loot元组,以及在一个行-列元组列表中实现它的路径:

    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
    
    将输出:

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

    这个问题在某些方面类似于背包问题。您可以通过dp或递归来解决它。 看看链接,它会让你更好地理解这个问题。
    您的问题有点不同,但逻辑是相同的。

    谢谢:)我曾考虑为行和列添加两个参数,但不确定。我刚刚意识到,
    itemgetter(0)
    是不必要的,因为比较第一项已经是元组比较的行为。我已经相应地更新了我的答案。
    (30, [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0)])