# 最小路径和
给定一个包含非负整数的 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
 
提示:
	- m == grid.length
- n == grid[i].length
- 1 <= m, n <= 200
- 0 <= grid[i][j] <= 100
以下程序实现了这一功能,请你填补空白处内容:
```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]);
```