您的位置:首页 > 其它

Minimum Path Sum

2014-09-11 07:59 232 查看
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]
表示点(m,n)的最小和,它可由min{f[m-1]
+grid[m]
,f[m][n-1]+grid[m]
}得到,然后注意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]
!= 0)
{
return f[m]
;
}
if (m == 1 && n != 1)
{
f[m]
= minPath(m,n-1,grid) + grid[m-1][n-1];
return f[m]
;
}
if (m != 1 && n == 1)
{
f[m]
= minPath(m-1, n, grid) + grid[m-1][n-1];
return f[m]
;
}
if (m == 1 && n == 1)
{
f[m]
= grid[m-1][n-1];
return f[m]
;
}
int top = minPath(m-1, n, grid);
int left = minPath(m, n-1, grid);
f[m]
= ((left <= top) ? left + grid[m-1][n-1] : top + grid[m-1][n-1]);
return f[m]
;
}
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);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: