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.
思路:这也是一道DP题,f[m][n]表示点(m,n)的最小和,它可由min{f[m-1][n]+grid[m][n],f[m][n-1]+grid[m][n]}得到,然后注意m=0 || m=1 || n=0 || n=1的临界条件即可。
class Solution {
private:
vector<vector<int> > f;
public:
int minPath(int m, int n, vector<vector<int> > &grid) {
if (m==0 || n==0)
{
return 0;
}
if (f[m][n] != 0)
{
return f[m][n];
}
if (m == 1 && n != 1)
{
f[m][n] = minPath(m,n-1,grid) + grid[m-1][n-1];
return f[m][n];
}
if (m != 1 && n == 1)
{
f[m][n] = minPath(m-1, n, grid) + grid[m-1][n-1];
return f[m][n];
}
if (m == 1 && n == 1)
{
f[m][n] = grid[m-1][n-1];
return f[m][n];
}
int top = minPath(m-1, n, grid);
int left = minPath(m, n-1, grid);
f[m][n] = ((left <= top) ? left + grid[m-1][n-1] : top + grid[m-1][n-1]);
return f[m][n];
}
int minPathSum(vector<vector<int> > &grid) {
int m = grid.size(),i,j;
if (m == 0)
{
return 0;
}
int n = grid[0].size();
f.resize(m+1);
vector<int> line;
for(i=0; i<=m; ++i)
{
line.clear();
line.resize(n+1);
for(j=0; j<=n; ++j)
line[j]= 0;
f[i]= line;
}
return minPath(m,n,grid);
}
};