一个二维数组,找出一条从左上角到右下角路径最短的。
代码:
int minPathSum(int** grid, int gridSize, int* gridColSize){
// 动态规划计算走到每格的最短路径
int path[gridSize][*gridColSize];
memset(path, 0, gridSize * (*gridColSize));
// 初始化第一行和第一列
path[0][0] = grid[0][0];
for (int i = 1; i < *gridColSize; i++) {
path[0][i] = path[0][i - 1] + grid[0][i];
}
for (int i = 1; i < gridSize; i++) {
path[i][0] = path[i - 1][0] + grid[i][0];
}
for (int i = 1; i < gridSize; i++) {
for (int j = 1; j < *gridColSize; j++) {
if (path[i][j - 1] < path[i - 1][j]) {
path[i][j] = path[i][j - 1] + grid[i][j];
} else {
path[i][j] = path[i - 1][j] + grid[i][j];
}
}
}
return path[gridSize - 1][*gridColSize - 1];
}
使用动态规划的方法,先初始化第一行和第一列,先填充path[0][0]
即为 grid[0][0]
,在初始化行时,path[i][j]=path[i][j-1]+grid[i][j]
,初始化第一列即为path[i][j]=path[i-1][j]+grid[i][j]
。
其他位置选取其上方和左方的一个较小值与其相加得到,path[i][j] = Min{path[i-1][j], path[i][j-1]} + grid[i][j]
。
path[m-1][n-1]
即为所求结果。
结果