题目:
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.
思路:
这道题和前两道基本一样,也是动态规划问题。
定义d[i][j]
为到位位置(i,j)
的最小路径和。
初始状态:
d[0][0]=grid[0][0]
状态转移方程:
d[i][j]=⎧⎩⎨⎪⎪d[i−1][j]+grid[i][j],d[i][j−1]+grid[i][j],min{d[i−1][j],d[i][j−1]}+grid[i][j],j=0;i=0;i,j>0
C++代码:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int m = grid.size();
int n = grid[0].size();
int d[1000][1000];
d[0][0] = grid[0][0];
for(int i=1;i<n;i++)
{
d[0][i] = d[0][i-1] + grid[0][i];
}
for(int i=1;i<m;i++)
{
d[i][0] = d[i-1][0] + grid[i][0];
}
for(int i = 1;i<m;i++)
{
for(int j=1;j<n;j++)
{
if(d[i-1][j]<d[i][j-1])
{
d[i][j] = d[i-1][j]+grid[i][j];
}
else
{
d[i][j] = d[i][j-1]+grid[i][j];
}
}
}
return d[m-1][n-1];
}
};