// 三步走
// 1. 确定数组意义:dp[i][j] 当前走到dp[i][j]的最小路径
// 2. 找出关系式: dp[i][j] = MIN(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]
// 3. 初始值: dp[0][0] = grid[0][0]
// dp[i][0] = grid[i][0] + dp[i - 1][0];
// dp[0][j] = grid[0][j] + dp[0][j - 1];
#define MIN(a, b) (a) <= (b) ? (a) : (b)
int minPathSum(int** grid, int gridSize, int* gridColSize){
if (NULL == grid || gridSize == 0 || *gridColSize == 0) return 0;
int i; int j;
int **dp = calloc(gridSize, sizeof(int *));
for (i = 0; i < gridSize; i ++) {
dp[i] =calloc(gridColSize[i], sizeof (int));
}
for (i = 0; i < gridSize; i++) {
for (j = 0; j < gridColSize[i]; j++) {
if (i == 0 && j == 0) {
dp[i][j] = grid[i][j];
} else if (i == 0 && j != 0) {
dp[i][j] = dp[i][j - 1] + grid[i][j];
} else if (i != 0 && j == 0) {
dp[i][j] = dp[i - 1][j] + grid[i][j];
} else {
dp[i][j] = (dp[i -1][j] <= dp[i][j - 1] ? dp[i - 1][j] : dp[i][j - 1]) + grid[i][j];
}
}
}
return dp[gridSize - 1][gridColSize[gridSize - 1] - 1];
}
https://leetcode-cn.com/problems/minimum-path-sum/
要注意gridColSize的含义