最小路径和

题目描述:

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

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

示例:

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

解题思路:

创建二维数组dp,与原始网格的大小相同,dp[i][j] 表示从左上角出发到 (i,j)位置的最小路径和。显然,dp[0][0] = grid[0][0]。对于 dp 中的其余元素,通过以下状态转移方程计算元素值。

  • 当 i>0 且 j=0 时,dp[i][0] = dp[i-1][0] + grid[i][0] 即求第一行结果
  • 当 j>0 且 i=0 时,dp[0][j] = dp[0][j-1] + grid[0][j] 即求第一列结果
  • 当 i>0 且j>0 时,dp[i][j] = Min(dp[i-1][j], dp[i][j-1]) + grid[i][j] 即求剩余结果
    //go
    func minPathSum(grid [][]int) int {
     if grid == nil || len(grid) == 0 || len(grid[0]) == 0 {
      return 0
     }
     row, col := len(grid), len(grid[0])
     dp := make([][]int, row)
        for i := 0; i < len(dp); i++ {
            dp[i] = make([]int, col)
        }
     dp[0][0] = grid[0][0]
     for i := 1; i < row; i++ {
      dp[i][0] = dp[i-1][0] + grid[i][0]
     }
     for j := 1; j < col; j++ {
      dp[0][j] = dp[0][j-1] + grid[0][j]
     }
     for i := 1; i < row; i++ {
      for j := 1; j < col; j++ {
       dp[i][j] = Min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
      }
     }
     return dp[row-1][col-1]
    }
    
    func Min(x, y int) int {
        if x < y {
            return x
        }
        return y
    }
    

      地址:https://mp.weixin.qq.com/s/zy8TYe3qwrZa0imUR9j7Qg

small_lei_it 技术无止境,追求更高。
原文地址:https://www.cnblogs.com/smallleiit/p/13533162.html