题目
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.
思路
此题和前面几个题的思路一模一样。
思路:每个点到终点的最短路径等于min(右边节点的最短路径,正下方节点的短路径 );
int minPathSum(int** grid, int gridRowSize, int gridColSize) {
if(grid==NULL||gridRowSize<1||gridColSize<1){
return 0;
}
if(gridRowSize==1&&gridColSize==1){
return grid[0][0];
}
//换两个短点的变量来表示
int m=gridRowSize;
int n=gridColSize;
//开辟一段空间来保存结果
int **result=(int **)malloc(m*sizeof(int *));
if(result==NULL){
exit(EXIT_FAILURE);
}
for(int i=0;i<m;i++){
result[i]=(int *)malloc(n*sizeof(int));
if(result[i]==NULL){
exit(EXIT_FAILURE);
}
memset(result[i],0,n*sizeof(int));//初始化为零
}
result[m-1][n-1]=grid[m-1][n-1];
//最后一列
for(int i=m-2;i>=0;i--){
result[i][n-1]=result[i+1][n-1]+grid[i][n-1];
}
//最后一行
for(int i=n-2;i>=0;i--){
result[m-1][i]=result[m-1][i+1]+grid[m-1][i];
}
for(int i=m-2;i>=0;i--){
for(int j=n-2;j>=0;j--){
result[i][j]=((result[i+1][j]<=result[i][j+1])?result[i+1][j]:result[i][j+1])+grid[i][j];
//result[i][j]=min(result[i+1][j],result[i][j+1])+grid[i][j];
}
}
return result[0][0];
}