leetcode::Minimum Path Sum
动态规划实现:
1.每个点走的方向只有两个方向,向下和向右。相对应的每个点来说,到这个点的路径最多有两种,从上方和从左方。
2.对于每个点求出两种可能路径的最短路径,再加上本点的值,就是等于从开始点到此点的最短路径。其中,对于坐标[0][j]这样的点只考虑左方,对于坐标[i][0]的点只考虑上方;
3.最后填满二维数组,则也求出了到[m-1][n-1]点的最短路径。
m表示行,n表示列
class Solution {
public:
int minPathSum(vector<vector<int> > &grid) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int m = grid.size();
int n= grid[0].size();
vector<vector<int> > rem(grid);
// write your code here
for( int i = 0; i < m; ++i)
{
for( int j=0; j< n;++j)
{
if( i == 0&& j==0)
{
continue;
}
if( i == 0)
{
rem[i][j] = rem[i][j-1] + grid[i][j];
}
else if( j== 0 )
{
rem[i][j] = rem[i-1][j] + grid[i][j];
}
else
{
rem[i][j] =min(rem[i-1][j],rem[i][j-1]) + grid[i][j];
}
}
}
return rem[m-1][n-1];
}
};
递归实现,如果不记录每次计算的结果会超时。
#define max 1000
int ream[max][max]={0};
class Solution {
public:
int PathSum(int i,int j,vector<vector<int>> &A) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if( ream[i][j] != 0 )
{
return ream[i][j];
}
if(i == 0 && j==0)
{
ream[0][0]=A[0][0];
return A[0][0];
}
if( i-1 >=0 && j-1 >= 0)
{
ream[i][j]=min(PathSum(i-1,j,A) , PathSum(i,j-1,A))+A[i][j];
}
if( i==0)
{
ream[i][j]= PathSum(i,j-1,A)+A[i][j];
}
if( j== 0 )
{
ream[i][j] =PathSum(i-1,j,A)+A[i][j];
}
return ream[i][j];
}
int minPathSum(vector<vector<int> > &grid) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int m = grid.size();
int n= grid[0].size();
for( int i = 0;i < m; i++)
{
for( int j=0; j < n; j++)
{
ream[i][j]=0;
}
}
if( m==1 && n==1 )
{
return grid[0][0];
}
return PathSum( m-1,n-1,grid);
}
};