这个题目就是典型的动态规划问题,因为每次只能向右或者向下走,所以对于一个矩阵,第一行和第一列的dp值就是前面的值相加得到的和。然后对于剩下的所有节点,其dp值应该是本节点的值和上边节点和左边节点中较小的dp值的和。公式为:
for i=1 to rows dp[0][i] = grid[0][i] + grid[0][i-1]
这是第一行的dp值for i=1 to columns dp[i][0] = grid[i-1][0] + grid[i][0]
这是第一列的dp值初始化,其中i是从1开始的而dp[0][0] = grid[0][0]
;- 对剩余的每个网格,
dp[i][j] = grid[i][j] + Math.min(dp[i-1][j], dp[i][j-1]);
最后返回dp[rows-1][columns-1]
就可以了。完整代码如下L
public static int minPathSum(int[][] grid) {
int rows = grid.length;
int columns = grid[0].length;
int[][] dp = new int[rows][columns];
dp[0][0] = grid[0][0]; //起点初始化
for (int i = 1; i < rows; ++i) //第一行
dp[i][0] = grid[i][0] + dp[i-1][0];
for (int j = 1; j < columns; ++j) //第一列
dp[0][j] = grid[0][j] + dp[0][j-1];
for (int i = 1; i < rows; ++i) { //剩余节点
for (int j = 1; j < columns; ++j) {
dp[i][j] = grid[i][j] + Math.min(dp[i-1][j], dp[i][j-1]);
}
}
//返回终点的dp值
return dp[rows-1][columns-1];
}