我最近被一个问题困住了。我必须找到从多维整数数组的左上角到右下角的路径的成本。这条路径的成本必须是不超过某个提供值的最大成本。
路径的成本定义为该路径经过的数组索引值的总和。每条路径的起点总是左上角,每条路径的终点总是右下角。此外,您只能向右或向下移动。
假设这是我用于解决此问题的多维数组,提供的值为 12。
+---+---+---+
| 0 | 2 | 5 |
+---+---+---+
| 1 | 1 | 3 |
+---+---+---+
| 2 | 1 | 1 |
+---+---+---+
这是我应该找到的正确路径。该路径的成本为 11,它是低于或等于给定值的任何路径的最高成本。
+---+---+---+
| X | X | X |
+---+---+---+
| 1 | 1 | X |
+---+---+---+
| 2 | 1 | X |
+---+---+---+
我试图在 Python 中解决这个问题,但我看不出哪里出错了。下面是我的一段代码。
def answer (food, grid):
# Grid is N*N in size
n = len(grid)
# Memoize a given function
def memoize (f):
memo = {}
def helper (r, c, k):
i = c + (r * n)
if i not in memo:
memo[i] = f(r, c, k)
return memo[i]
return helper
# Get cost function
def get_cost (r, c, k):
if r >= n or c >= n:
return -1
if k < grid[r][c]:
return -1
if r == n - 1 and c == n - 1:
return grid[r][c]
down = get_cost(r + 1, c, k - grid[r][c])
right = get_cost(r, c + 1, k - grid[r][c])
if down < 0 and right < 0:
return -1
return grid[r][c] + max(down, right)
# Memoize the get cost function
get_cost = memoize(get_cost)
return get_cost(0, 0, food)
print answer (12, [[0, 2, 5], [1, 1, 3], [2, 1, 1]])
我总是得到 16 的答案,而我应该得到 11 的答案。谁能帮我解决这个问题?
编辑:
我更改了我的 memoize 代码以将给定的食物值包含在索引中。我得到了正确的答案。但是,还有其他情况下它不起作用。(在这些情况下,我没有提供输入,所以我看不出哪里出错了)。
这是我更新的代码。
# Memoize a given function
def memoize (f):
memo = {}
def helper (r, c, k):
i = (k * food) + (c + (r * n))
if i not in memo:
memo[i] = f(r, c, k)
return memo[i]
return helper