【leetcode系列】【算法】【中等】最小路径和

题目:

题目链接: 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]
发布了100 篇原创文章 · 获赞 4 · 访问量 1491

猜你喜欢

转载自blog.csdn.net/songyuwen0808/article/details/105236021
今日推荐