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);

}
};

posted @ 2013-05-30 16:21  NinaGood  阅读(350)  评论(0编辑  收藏  举报