leetcode刷题笔记六十四 最小路径和
源地址:64. 最小路径和
问题描述:
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
代码补充:
/**
与之前路径问题解决方法一致,使用动态规划解决问题
使用滚动数组思想
动态方程初始状态:
dp(0) = grid(0)(0)
第一行的初始化,dp(i) = dp(i-1) + grid(0)(i), i <- 1 to length-1
对于第一列, dp(0) = dp(0) + grid(i)(0)
其他(以目标点为例,其只能由左侧和上侧访问)dp(j) = math.min(dp(j), dp(j-1)) + grid(i)(j)
*/
object Solution {
def minPathSum(grid: Array[Array[Int]]): Int = {
val high = grid.length
val length = grid(0).length
val dp = Array.fill(length)(0)
//init dp
dp(0) = grid(0)(0)
for(i <- 1 to length-1) dp(i) = dp(i-1) + grid(0)(i)
for(i <- 1 to high-1; j <- 0 to length-1){
if (j == 0) dp(j) = dp(j) + grid(i)(0)
else dp(j) = math.min(dp(j), dp(j-1)) + grid(i)(j)
}
return dp(length-1)
}
}