Minimum Path Sum
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.
这道题目明显用动态规划,最优子结构为
a[i][j]=min(a[i][j-1],a[i-1][j])+grid[i][j];
注意
(1)本题我用malloc来开辟二维数组,开辟的主要过程为
int **a = (int **)malloc(sizeof(int *)*(m+1));
for(int i=0;i<(m+1);i++)
{
a[i] = (int *)malloc(sizeof(int)*(n+1));
}
但是在二维数组初始化的过程中,不能简简单单用memset:
for (int i = 0; i < m+1; ++i)
memset(a[i], -1, sizeof(int)*(n+1));
(2)边界条件的书写
class Solution {
public:
int minPathSum(vector<vector<int> > &grid) {
int m=grid.size();
int n=grid[0].size();
if(m==0 || n==0)return 0;
//int a[1000][1000];
//memset(a, -1, sizeof(a));
int **a = (int **)malloc(sizeof(int *)*(m+1));
for(int i=0;i<(m+1);i++)
{
a[i] = (int *)malloc(sizeof(int)*(n+1));
}
for (int i = 0; i < m+1; ++i)
memset(a[i], -1, sizeof(int)*(n+1));
//边界
a[0][0]=grid[0][0];
for(int i=1;i<m;i++)
a[i][0]=a[i-1][0]+grid[i][0];
for(int j=1;j<n;j++)
a[0][j]=a[0][j-1]+grid[0][j];
for(int i=1;i<m;i++)
{
for(int j=1;j<n;j++)
{
a[i][j]=min(a[i][j-1],a[i-1][j])+grid[i][j];
}
}
return a[m-1][n-1];
}
};