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.
题目大意:给出一个m * n的矩阵,求从矩阵左上角走到右下角的路径上元素之和的最小值,要求只能向下或向右走。
解题思路:设sum[i, j]为从矩阵右上角(0, 0)走到(i, j)经过的路径上元素之和的最小值,那么可以得到以下状态转移方程
(1)当i == 0且j == 0时,sum[i, j] = grid[i, j]
(2)当i == 0且j != 0时,sum[i, j] = grid[i, j] + sum[i, j - 1]
(3)当i != 0且j == 0时,sum[i, j] = grid[i, j] + sum[i - 1, j]
(4)当i != 0且j != 0时,sum[i, j] = grid[i, j] + min(sum[i - 1, j], sum[i, j - 1])
代码如下:
#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))
int minPathSum(int** grid, int gridRowSize, int gridColSize) {
int** sum = malloc(sizeof(int*) * (gridRowSize + 1));
for(int i = 0;i <= gridRowSize;i++) sum[i] = malloc(sizeof(int) * (gridColSize + 1));
for(int i = 0;i < gridRowSize;i++){
for(int j = 0;j < gridColSize;j++){
if(i == 0 && j == 0) sum[i][j] = 0;
else if(i == 0) sum[i][j] = sum[i][j - 1];
else if(j == 0) sum[i][j] = sum[i - 1][j];
else sum[i][j] = MIN(sum[i - 1][j], sum[i][j - 1]);
sum[i][j] += grid[i][j];
}
}
int ans = sum[gridRowSize - 1][gridColSize - 1];
for(int i = 0;i <= gridRowSize;i++) free(sum[i]);
free(sum);
return ans;
}