zoukankan      html  css  js  c++  java
  • [LeetCode] 64. 最小路径和

    题目链接 : https://leetcode-cn.com/problems/minimum-path-sum/

    题目描述:

    给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

    说明:每次只能向下或者向右移动一步。

    示例:

    输入:
    [
      [1,3,1],
      [1,5,1],
      [4,2,1]
    ]
    输出: 7
    解释: 因为路径 1→3→1→1→1 的总和最小。
    

    思路:

    62. 不同路径,63. 不同路径 II是一类的题型.

    动态规划,用dp[i][j]表示到i,j的最小路径和.

    动态方程: dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]

    注意这里的第一行,和第一列要单独考虑,

    还有可以直接在grid上操作,优化空间!

    再附上自顶向下动态规划, 大家可以附上 Java 代码吗?

    代码:

    自底向上

    class Solution:
        def minPathSum(self, grid: List[List[int]]) -> int:
            if not grid: return 0
            row = len(grid)
            col = len(grid[0])
            dp = [[0]*col for _ in range(row)]
            dp[0][0] = grid[0][0]
            # 第一行
            for j in range(1, col):
                dp[0][j] = dp[0][j-1] + grid[0][j]
            # 第一列
            for i in range(1, row):
                dp[i][0] = dp[i-1][0] + grid[i][0]
            
            for i in range(1, row):
                for j in range(1, col):
                    dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
            return dp[-1][-1]
    

    java

    class Solution {
        public int minPathSum(int[][] grid) {
            if (grid == null) return 0;
            int row = grid.length;
            int col = grid[0].length;
            int[][] dp = new int[row][col];
            dp[0][0] = grid[0][0];
            // 第一行
            for (int j = 1; j < col; j++) dp[0][j] = dp[0][j - 1] + grid[0][j];
            // 第一列
            for (int i = 1; i < row; i++) dp[i][0] = dp[i - 1][0] + grid[i][0];
            for (int i = 1; i < row; i++) {
                for (int j = 1; j < col; j++) {
                    dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
                }
            }
            return dp[row - 1][col - 1];
        }
    }
    

    自顶向下

    class Solution:
        def minPathSum(self, grid: List[List[int]]) -> int:
            import functools
            if not grid: return 0
            row = len(grid)
            col = len(grid[0])
            @functools.lru_cache(None)
            def helper(i,j):
                if i == row - 1 and j == col - 1:
                    return grid[i][j]
                if i >= row or j >= col:
                    return float("inf")
                tmp = 0
                tmp += grid[i][j] + min(helper(i, j+1), helper(i+1, j))
                return tmp
            return helper(0, 0)
    
  • 相关阅读:
    HRBUST 1849 商品中心
    UVA 11600 Masud Rana
    Codeforces Round #580 (Div.1)
    loj 6270 数据结构板子题
    luogu P1758 [NOI2009]管道取珠
    luogu P1852 [国家集训队]跳跳棋
    51nod 2589 快速讨伐
    SICP_3.9-3.11
    SICP_3.7-3.8
    SICP_3.5-3.6
  • 原文地址:https://www.cnblogs.com/powercai/p/10919530.html
Copyright © 2011-2022 走看看