新人发文,大佬轻喷,希望能够能给同样开始学习算法的小伙伴提供一些参考。
题目说明:给定一个包含非负整数的 m x n
网格 grid
,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
1 | 3 | 1 |
1 | 5 | 1 |
4 | 2 | 1 |
解题思路:
首先确定数组含义,可以设a[i][j]为到达(i,j)点的最短路径和,二维数组grid记录了每个位置的路径值。
之后确定数组关系式,由图表可知,想要到达(i,j)点只有两种路线,分别是从(i-1,j)和(i,j-1)点到达,并且要从这两条路径之中选择更短的路径,由此可得关系式:
a[i][j] = min( a[i-1][j] , a[i][j-1])+grid[i][j]
得出关系式后,我们需要来确定动态规划的初值,由于我们只能向下和向右移动,这就表明第一行和第一列的最短路径和已经固定,分别是第一行和第一列的累加和再加上自身的值,即:
a[0][i] = a[0][i-1] + grid[0][i];
a[j][0] = a[j-1][0] + grid[j][0];
当数组含义,数组关系式,数组初值已经确定后,可由此推导出解题过程。
代码如下:
public static int minPathSum(int[][] grid) {
int m = grid.length;//行数
int n = grid[0].length;//列数
int[][] a = new int[m][n];//到达某一位置的最短路径和数组
//为第一行和第一列赋值
a[0][0] = grid[0][0];
for(int i=1;i<n;i++)//计算第一行内到达每一个位置最短路径和
a[0][i] = grid[0][i] + a[0][i-1];
for(int j=1;j<m;j++)//计算第一列内到达每一个位置最短路径和
a[j][0] = grid[j][0] + a[j-1][0];
for(int i=1;i<m;i++)
for(int j=1;j<n;j++){
a[i][j] = grid[i][j] + Math.min(a[i-1][j],a[i][j-1]);
}
return a[m-1][n-1];
}
原题地址:力扣