题目:
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.
思想:
采用动态规划,对于位置[i,j],有最小和为minSum[i][j]=min{minSum[i-1][j],minSum[i][j-1]}+grid[i][j]。所以要定义一个minSum[m][n]的二维数组来存储变量。代码如下,但是从状态方程可以看出,minSum[i][j]只与minSum[i-1][j]和minSum[i][j-1]有关,所以空间复杂度,可以减小。
代码:
class Solution {
public:
int minPathSum(vector<vector<int> >& grid) {
int lenm = grid.size();
int lenn = grid[0].size();
if (lenm==0)
{
return 0;
}
vector<vector<int> > minSum(lenm,vector<int>(lenn,0));//初始化minSum
minSum[0][0] = grid[0][0];
for (int i = 1; i < lenn; i++)//初始化第一行
{
minSum[0][i] = minSum[0][i-1] + grid[0][i];
}
for (int i = 1; i < lenm; i++)//初始化第一列
{
minSum[i][0] = minSum[i - 1][0] + grid[i][0];
}
for (int i = 1; i < lenm; i++)
{
for (int j = 1; j < lenn; j++)
{
minSum[i][j] = min(minSum[i - 1][j], minSum[i][j - 1]) + grid[i][j];//状态转移方式
}
}
return minSum[lenm - 1][lenn - 1];
}
};