谁能告诉我为什么这两个代码给出不同的输出.它们不是具有两种不同实现的相同代码吗(一种是强力实现,另一种是使用动态编程).
程序描述:给出一个用非负数填充的m x n网格,找到一条从左上角到右下角的路径,它使路径上所有数字的和最小化.
def minPathSum_dp(grid):
def dfs(i, j, pathSum):
if (i, j) in dp:
return dp[(i, j)]
if i == len(grid)-1 and j == len(grid[i])-1:
return pathSum + grid[i][j]
if i == len(grid)-1:
return dfs(i, j+1, pathSum + grid[i][j])
if j == len(grid[i])-1:
return dfs(i+1, j, pathSum + grid[i][j])
path1 = dfs(i+1, j, pathSum + grid[i][j])
path2 = dfs(i, j+1, pathSum + grid[i][j])
dp[(i, j)] = min(path1, path2)
return dp[(i, j)]
dp = {}
return dfs(0, 0, 0)
def minPathSum_bf(grid):
def dfs(i, j, pathSum):
if i == len(grid)-1 and j == len(grid[i])-1:
return pathSum + grid[i][j]
if i == len(grid)-1:
return dfs(i, j+1, pathSum + grid[i][j])
if j == len(grid[i])-1:
return dfs(i+1, j, pathSum + grid[i][j])
path1 = dfs(i+1, j, pathSum + grid[i][j])
path2 = dfs(i, j+1, pathSum + grid[i][j])
return min(path1, path2)
return dfs(0, 0, 0)
grid = [[1,4,8,6,2,2,1,7],[4,7,3,1,4,5,5,1],[8,8,2,1,1,8,0,1],[8,9,2,9,8,0,8,9],[5,7,5,7,1,8,5,5],[7,0,9,4,5,6,5,6],[4,9,9,7,9,1,9,0]]
UPDATED: WORKING SOLUTION
def minPathSum(self, grid: List[List[int]]) -> int:
def dfs(i, j):
if (i, j) in dp:
return dp[(i, j)]
if i == len(grid)-1 and j == len(grid[i])-1:
return grid[i][j]
if i == len(grid)-1:
dp[(i, j)] = grid[i][j] + dfs(i, j+1)
return dp[(i, j)]
if j == len(grid[i])-1:
dp[(i, j)] = grid[i][j] + dfs(i+1, j)
return dp[(i, j)]
path1 = grid[i][j] + dfs(i+1, j)
path2 = grid[i][j] + dfs(i, j+1)
dp[(i, j)] = min(path1, path2)
return dp[(i, j)]
dp = {}
return dfs(0, 0)
print(minPathSum_dp(grid))
print(minPathSum_bf(grid))