leetcode刷题笔记六十四 最小路径和

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)
    }
}
posted @ 2020-07-15 11:30  ganshuoos  阅读(106)  评论(0编辑  收藏  举报