实际上,这道题就是三角矩阵和求路径的融合版本,知晓前两个题的解法,带权值的最小路径和可以直接拿下。
三角矩阵链接
题目:给定一个由非负整数填充的m x n的二维数组,现在要从二维数组的左上角走到右下角,请找出路径上的所有数字之和最小的路径。
注意:你每次只能向下或向右移动。
分析思路:实际上本题的思路也就是求从(0,0)坐标到坐标(i,j)的最短路径和,第一行的坐标(0,j)只能被(0,j-1)坐标向右移动一步得到,第一列的坐标(i,0)只能被(i-1,0)坐标向下移动一步得到,这两种的坐标的状态都为自己的路径权值加上一步移动到该坐标的坐标的权值。其他的坐标(i,j)能被坐标(i-1,j)向下或坐标(i,j-1)向右移动一步获得,因此其状态为自己的路径权值加上这两种移动方式中路径权值更小的坐标的状态。最后返回的是最右下角的坐标的权值状态。
综上所述:
动态规划四角度:
- 状态定义F(i,j):从坐标(0,0)到达坐标(i,j)的最短路径和;
- 状态间的转移方程定义:
- i == 0,F(0,j) = F(0,j-1) + grid[0][j];
- j == 0,F(i,0) = F(i-1,0) + grid[i][0];
- 其余,F(i,j) = min(F(i-1,j),F(i,j-1)) + grid[i][j];
- 状态的初始化 F(0,0) = grid[0][0];
- 返回结果 F(row-1,col-1);
import java.util.*;
public class Solution {
public int minPathSum (int[][] grid) {
int row = grid.length;//行
int col = grid[0].length;//列
if(row == 0 && col == 0) return 0;
//第一列状态转移
for(int i = 1;i < row;i ++) {
grid[i][0] = grid[i-1][0] + grid[i][0];
}
//第一行状态转移
for(int j = 1;j < col;j ++) {
grid[0][j] = grid[0][j-1] + grid[0][j];
}
//其余坐标状态转移
for(int i = 1;i < row;i++) {
for(int j = 1;j < col;j++) {
grid[i][j] = Math.min(grid[i-1][j],grid[i][j-1]) + grid[i][j];
}
}
return grid[row-1][col-1];//返回结果
}
}
完!