LeetCode | Minimum Path Sum

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

Note: You can only move either down or right at any point in time.

这道题和Unique Paths 完全一样 ,只是那一题给加了一个情境,算是一个典型的座标DP吧。

做这题就相当于复习了,顺便找一下之前没有注意到的地方。

dp方程很简单粗暴:dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j]

表示一个点可以由左侧或上面+当前格子的value。

由于i-1会涉及到判0的问题,所以其实有2种方法:

(1)将边界设置为无穷大,dp方程大小往里扩大1,返回dp[m][n]

(2)将边界首先进行初始化,dp方程不扩大,返回dp[m-1][n-1]

两种思路都不是很复杂,初始化为最大的需要对[0,0]点特判

class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int m=grid.size();
        if(m==0) return 0;
        int n=grid[0].size();
        
        //dp数组初始化
        int dp[m+1][n+1];
        memset(dp,0,sizeof(dp));
        //初始化边界
        // dp[0][0]=grid[0][0];
        // for(int j=1;j<n;j++) dp[0][j]=dp[0][j-1]+grid[0][j];
        // for(int i=1;i<m;i++) dp[i][0]=dp[i-1][0]+grid[i][0];
        
        // for(int i=1;i<m;i++){
        //     for(int j=1;j<n;j++){
        //         dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j];
        //     }
        // }
        // return dp[m-1][n-1];
        
        for(int i=0;i<=n;i++) dp[0][i]=INT_MAX;
        for(int j=0;j<=m;j++) dp[j][0]=INT_MAX;
        dp[1][1]=grid[0][0];
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                if(i!=1 || j!=1)
                dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1];
            }
        }
        return dp[m][n];
    }
};

点赞