dp问题描述
确定本题的状态表示
dp[i][j]表示的是矩阵从左上角走到(i,j)位置一路上的数字总和的最小值
确定本题的状态转移方程
本题的状态转移方程依然是
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1];
但是要注意边界条件,因为边界值初始化为0,我们比的又是最小值,所以当i和j位于矩阵数值边界时,不能把最外围那层0加进来比,否则会污染有效数据
填表求值
根据初始条件和状态转移方程,确定填表顺序,进而逐步填满dp表,最终返回题目要的结果
代码实现
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m=grid.size();
if(m==0) return 0;
int n=grid[0].size();
vector<vector<int>> dp(m+1,vector<int>(n+1,0));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(i==1)
dp[i][j]=dp[i][j-1]+grid[i-1][j-1];
else if(j==1)
dp[i][j]=dp[i-1][j]+grid[i-1][j-1];
else
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1];
cout << "dp["<<i<<"]["<<j<<"]="<< dp[i][j]<< endl;
}
}
return dp[m][n];
}
};