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];
}
};