64. 最小路径和(minimum-path-sum)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/scylhy/article/details/83537447

64. 最小路径和(minimum-path-sum)

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

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

示例:

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

      经典的简单的学习动态规划的题目,因为是求路径和且只能向右和向下 ,  
    所以第一行和第一列上的每个位置的最小路径和是确定的;sum(i,j)上的  
    最小路径和,则是min{sum(i-1,j),sum(i,j-1)}+grid(i,j)。  
    由此可得递推公式:
    

f ( i , j ) = { min { f ( i 1 , j ) , f ( i , j ) } i > 0 , j > 0 k = 0 k = j g r i d ( 0 , j ) i = 0 k = 0 k = i g r i d ( i , 0 ) j = 0 f(i,j)=\left\{ \begin{aligned} & \min\{f(i-1,j),f(i,j)\} & & i>0,j>0 \\ &\sum_{k=0}^{k=j}{grid(0,j)} & & i=0 \\ & \sum_{k=0}^{k=i}{grid(i,0)} & & j=0 \end{aligned} \right.

  • code
    package main
    import "fmt"
    func minPathSum(grid [][]int) int {
    	if len(grid)==0{
    		return 0
    	}
    	//初始化第一行
    	for i:=1;i<len(grid[0]);i++ {
    		grid[0][i]+=grid[0][i-1]
    	}
    	//初始化第一列
    	for i:=1;i<len(grid);i++{
    		grid[i][0]+=grid[i-1][0]
    	}
    	for i:=1;i<len(grid);i++{
    		for j:=1;j<len(grid[0]);j++{
    			if grid[i-1][j]<grid[i][j-1]{
    				grid[i][j]+=grid[i-1][j]
    			}else{
    				grid[i][j]+=grid[i][j-1]
    			}
    		}
    	}
    	return grid[len(grid)-1][len(grid[0])-1]
    }
    func main(){
    	fmt.Println(minPathSum([][]int{{1,3,1},{1,5,1},{4,2,1}}))
    	fmt.Println(minPathSum([][]int{}))
    }
    

猜你喜欢

转载自blog.csdn.net/scylhy/article/details/83537447
今日推荐