题目:
题目链接: https://leetcode-cn.com/problems/minimum-path-sum/
解题思路:
DP思想,假设原格子的代价数组为grid
因为每次只能想下或者向右移动一步,所以如果从右下角开始向左上角反推时,dp[i][j]的最小代价为grid[i][j] + min(dp[i][j + 1], dp[i + 1][j])
直到反推回[0][0]点,就获得了最小的代价值
或者从左上角向右下角推,每个点的最小代价dp[i][j] = grid[i][j] + min(dp[i - 1][j], dp[i][j - 1]),最后获取最小代价时,需要获取dp的最后一个元素dp[-1][-1]
另外,如果不仅仅是获取最小代价,而是要同时获取路径信息的话,就需要用到双向dijkstra、CRP、CH等算法了
如果有感兴趣的,我再另起一篇文章讲相关算法
代码实现:
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
if 0 == len(grid) or 0 == len(grid[0]):
return 0
dp_lst = [0] * len(grid[0])
for i in range(len(grid) - 1, -1, -1):
for j in range(len(grid[i]) - 1, -1, -1):
if i == len(grid) - 1 and j == len(grid[i]) - 1:
dp_lst[j] = grid[i][j]
elif i == len(grid) - 1 and j != len(grid[i]) - 1:
dp_lst[j] = grid[i][j] + dp_lst[j + 1]
elif i != len(grid) - 1 and j == len(grid[i]) - 1:
dp_lst[j] = grid[i][j] + dp_lst[j]
else:
dp_lst[j] = grid[i][j] + min(dp_lst[j], dp_lst[j + 1])
return dp_lst[0]