定义dp数组:
dp[i][j]的含义为移动到点i,j的最小路径和。
状态转移方程
dp[i][j] = min(dp[i-1][j],dp[i][j-1])+array[i][j];
即:当前点的最小路径和等于(左边和上边点的路径和的较小的一个)+ 当前点的值。
初始化
根据状态转移方程,我们需要初始化第0行和第0列。
即:
dp[i][0] =dp[i-1][0]+array[i][0]; //即第0列第i行的最小路径和等于第0列第i-1行的最小路径和加上当前点的值。另外一个同理。
同时,上述初始化需要初始化(0,0)这个点。
代码如下:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size();
int n = grid[0].size();
vector<vector<int>> dp(m,vector<int>(n,0));
dp[0][0] = grid[0][0]; //初始化原点
for(int i=1;i<m;i++) //从1开始,初始化第0列
{
dp[i][0] = dp[i-1][0] + grid[i][0];
}
for(int j=1;j<n;j++)// 从1开始,初始化第0行
{
dp[0][j] = dp[0][j-1] + grid[0][j];
}
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];
}
};