# 最小路径和

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

 

示例 1:

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:
7
解释:
因为路径 1→3→1→1→1 的总和最小。

示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:
12

 

提示:

以下程序实现了这一功能,请你填补空白处内容: ```cpp #include #include #include static inline int min(int a, int b) { return a < b ? a : b; } int minPathSum(int **grid, int gridRowSize, int gridColSize) { int i, j; int **dp = malloc(gridRowSize * sizeof(int *)); for (i = 0; i < gridRowSize; i++) { dp[i] = malloc(gridColSize * sizeof(int)); } dp[0][0] = grid[0][0]; int sum = dp[0][0]; for (i = 1; i < gridRowSize; i++) { sum += grid[i][0]; dp[i][0] = sum; } sum = dp[0][0]; for (i = 1; i < gridColSize; i++) { sum += grid[0][i]; dp[0][i] = sum; } for (i = 1; i < gridRowSize; i++) { for (j = 1; j < gridColSize; j++) { _____________________; } } return dp[gridRowSize - 1][gridColSize - 1]; } int main(int argc, char **argv) { int i, j; int row = argc - 1; int col = strlen(argv[1]); int **grid = malloc(row * sizeof(int *)); for (i = 0; i < row; i++) { grid[i] = malloc(col * sizeof(int)); for (j = 0; j < col; j++) { grid[i][j] = argv[i + 1][j] - '0'; printf("%d ", grid[i][j]); } printf("\n"); } printf("%d\n", minPathSum(grid, row, col)); return 0; } ``` ## template ```cpp #include #include #include static inline int min(int a, int b) { return a < b ? a : b; } int minPathSum(int **grid, int gridRowSize, int gridColSize) { int i, j; int **dp = malloc(gridRowSize * sizeof(int *)); for (i = 0; i < gridRowSize; i++) { dp[i] = malloc(gridColSize * sizeof(int)); } dp[0][0] = grid[0][0]; int sum = dp[0][0]; for (i = 1; i < gridRowSize; i++) { sum += grid[i][0]; dp[i][0] = sum; } sum = dp[0][0]; for (i = 1; i < gridColSize; i++) { sum += grid[0][i]; dp[0][i] = sum; } for (i = 1; i < gridRowSize; i++) { for (j = 1; j < gridColSize; j++) { dp[i][j] = grid[i][j] + min(dp[i - 1][j], dp[i][j - 1]); } } return dp[gridRowSize - 1][gridColSize - 1]; } int main(int argc, char **argv) { int i, j; int row = argc - 1; int col = strlen(argv[1]); int **grid = malloc(row * sizeof(int *)); for (i = 0; i < row; i++) { grid[i] = malloc(col * sizeof(int)); for (j = 0; j < col; j++) { grid[i][j] = argv[i + 1][j] - '0'; printf("%d ", grid[i][j]); } printf("\n"); } printf("%d\n", minPathSum(grid, row, col)); return 0; } ``` ## 答案 ```cpp dp[i][j] = grid[i][j] + min(dp[i - 1][j], dp[i][j - 1]); ``` ## 选项 ### A ```cpp dp[i][j] = grid[i][j] + min(dp[i][j], dp[i - 1][j - 1]); ``` ### B ```cpp dp[i][j] = grid[i][j] + min(dp[i][j - 1], dp[i - 1][j - 1]); ``` ### C ```cpp dp[i][j] = grid[i][j] + min(dp[i - 1][j + 1], dp[i + 1][j - 1]); ```