题目描述
给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例
示例 1:
输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/mi…
实现
int minPathSum(int **grid, int gridSize, int *gridColSize)
{
// 从左到右,dp当前最短的路径
if (grid == NULL || gridSize == 0) {
return 0;
}
int dp[gridSize][gridColSize[0]];
memset(dp, 0, sizeof(int) * gridSize * gridColSize[0]);
/*
* 状态转移方程 dp[i][j]表示走到该位置所需的最短路径
* dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
*/
dp[0][0] = grid[0][0];
for (int i = 0; i < gridSize; i++) {
for (int j = 0; j < gridColSize[i]; j++) {
if (i == 0 && j == 0) {
dp[i][j] = grid[i][j];
} else if (i == 0) {
dp[i][j] = dp[i][j-1] + grid[i][j];
} else if (j == 0) {
dp[i][j] = dp[i-1][j] + grid[i][j];
} else {
dp[i][j] = (dp[i][j-1] > dp[i-1][j] ? dp[i-1][j] : dp[i][j-1]) + grid[i][j];
}
}
}
return dp[gridSize-1][gridColSize[0]-1];
}
复制代码