
方法-动态规划
- 因为非负,所以每一步只能往下走或往右走,
- 所以我们可以初始第一排和第一列的最小路径和
- 所以到达每一个位置的最小路径一定来自它左边格子和上边格子中最小路径和中偏小的那个
- 因为我们已经有了第一列和第一行的最小路径和,那么我们自然可以得出任意一格的最小路径和,当然这个值要从可以得出的值一步一步推进到这里
代码 :
- 建立二维切片dp,并初始化大小,初始化外围的一维切片时直接make创建就可以了,初始一维切片里面的一维切片时,要for遍历外围的一维切片,将其make创建大小
- 初始化完成后再将第一列,第一行填入数据,
- 最后双层for循环以此填入数据就可以了
- dp切片的右下角的元素就是最小路径和
func minPathSum(grid [][]int) int {
n := len(grid)
r := len(grid[0])
dp := make([][]int,n)
for i := 0; i < n; i++ {
dp[i] = make([]int,r)
}
dp[0][0] = grid[0][0]
for i := 1; i < r; i++ {
dp[0][i] = grid[0][i] + dp[0][i-1]
}
for i := 1; i < n; i++ {
dp[i][0] = grid[i][0] + dp[i-1][0]
}
for i := 1; i < n; i++ {
for j := 1; j < r; j++ {
dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
}
}
return dp[n-1][r-1]
}
func min(a,b int) int {
if a < b {
return a
}
return b
}