Skip to content
On this page
✍️Younglina🕐2022-04-20 🔗 动态规划中等

题目描述

64.最小路径和
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。

示例 1:

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

示例 2:

输入:grid = [[1,2,3],[4,5,6]]  
输出:12  

提示

m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 100

思路

动态规划: 由题意可知到右下角,只能从上面或者左边来,所以最小值就是取上面或者左边的最小值,然后加上当前值。
即动态转移方程为: dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
第一行和第一列的数据,可以直接赋值,因为不能从上面或者左边来。
第一行的等于左边的加上当前值,第一列的等于上面的加上当前值。

13+1=41+4=5
1+1=25+min(4,2)=71+min(5,7)=6
4+2=62+min(7,6)=81+mid(6,8)=7

题解

javascript
var uniquePathsWithObstacles = function(grid) {
    let m = grid.length,n=grid[0].length
    for(let i=1;i<m;i++){
        grid[0][i] += grid[0][i-1]
    }  
    for(let j=1;j<n;j++){
        grid[j][0] += grid[j-1][0]
    }  
    for(let i=1;i<n;i++){
        for(let j=1;j<m;j++){
            grid[i][j] += Math.min(grid[i-1][j],grid[i][j-1])
        }
    }
    return grid[n-1][m-1]
};