Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
还是运用了动态规划的思想,即全局最优则要求局部最优。
设置数组pathSum[i][j]代表从起点到(i,j)的最短路径长度,则有
pathSum[i][j] = min(pathSum[i - 1][j] + grid[i][j], pathSum[i][j - 1] + grid[i][j])
则采用两重循环,一行一行的将各个位置的最短路径长度填入pathSum数组,最后返回pathSum[gridRowSize-1][gridColSize-1]即可。
也可将程序优化,将数组重用,则只需要一维数组pathSum[gridColSize]即可。
优化后代码:
int min(int a, int b){
return a < b ? a : b;
}
int minPathSum(int** grid, int gridRowSize, int gridColSize) {
int pathSum[gridColSize];
int i, j;
for(i = 0; i < gridRowSize; i++){
for(j = 0; j < gridColSize; j++){
if(i == 0 && j == 0){
pathSum[j] = grid[i][j];
}else if(i == 0){
pathSum[j] = pathSum[j - 1] + grid[i][j];
}else if(j == 0){
pathSum[j] = pathSum[j] + grid[i][j];
}else{
pathSum[j] = min(pathSum[j - 1] + grid[i][j], pathSum[j] + grid[i][j]);
}
}
}
return pathSum[j - 1];
}