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.
Array Dynamic Programming
Have you met this question in a real interview?
解法一:记忆深搜
class Solution {
public:
int res=0x3f3f3f3f;
void function(vector<vector<int> > grid,int x,int y,int sum)
{
if(x==grid.size()&&y==grid[0].size())
{
if(sum<res)
res=sum;
return ;
}
else if(x==grid.size()&&y!=grid[0].size()){
function(grid,x,y+1,sum+grid[x-1][y]);
}
else if(x!=grid.size()&&y==grid[0].size())
function(grid,x+1,y,sum+grid[x][y-1]);
else
{
function(grid,x+1,y,sum+grid[x][y]);
function(grid,x,y+1,sum+grid[x][y]);
}
}
int minPathSum(vector<vector<int> > &grid) {
int row=grid.size();
int col=grid[0].size();
if(row<1||col<1)
return 0;
function(grid,0,0,0);
return res;
}
};
Status:
Time Limit Exceeded
解法2:动态规划
best[i][j]=min{best[i-1][j],best[i][j-1]}+grid[i][j]
class Solution {
public:
#define MIN(a,b) (((a)<(b))?(a):(b))
int minPathSum(vector<vector<int> > &grid) {
int row=grid.size();
int col=grid[0].size();
int res=0;
if(row<1||col<1)
return 0;
//function(grid,0,0,0);
if(row==1)
{
for(int i=0;i<col;i++)
res+=grid[0][i];
return res;
}
if(col==1)
{
for(int i=0;i<row;i++)
res+=grid[i][0];
return res;
}
int **best=new int*[row];
for(int i=0;i<row;i++)
{
best[i]=new int[col];
memset(best[i],0,sizeof(int)*col);
}
// best[0][0]=grid[0][0];
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
{
if(i==0&&j==0)
best[0][0]=grid[0][0];
else if(i==0&&j!=0)
best[i][j]=best[i][j-1]+grid[i][j];
else if(i!=0&&j==0)
best[i][j]=best[i-1][j]+grid[i][j];
else
best[i][j]=MIN(best[i-1][j],best[i][j-1])+grid[i][j];
}
return best[row-1][col-1];
}
};
class Solution {
public:
#define MIN(a,b) (((a)<(b))?(a):(b))
int minPathSum(vector<vector<int> > &grid) {
int row=grid.size();
int col=grid[0].size();
int res=0;
if(row<1||col<1)
return 0;
//function(grid,0,0,0);
if(row==1)
{
for(int i=0;i<col;i++)
res+=grid[0][i];
return res;
}
if(col==1)
{
for(int i=0;i<row;i++)
res+=grid[i][0];
return res;
}
int **best=new int*[row];
for(int i=0;i<row;i++)
{
best[i]=new int[col];
memset(best[i],0,sizeof(int)*col);
}
// best[0][0]=grid[0][0];
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
{
if(i==0&&j==0)
best[0][0]=grid[0][0];
else if(i==0&&j!=0)
best[i][j]=best[i][j-1]+grid[i][j];
else if(i!=0&&j==0)
best[i][j]=best[i-1][j]+grid[i][j];
else
best[i][j]=MIN(best[i-1][j],best[i][j-1])+grid[i][j];
}
return best[row-1][col-1];
}
};