题目:给定一个正整数的m*n的二维数组网格,求可以使从左上角到右下角的最小路径的数字之和。
解题方法:动态规划
举例:arr[][] = {{1,2,3},{4,10,88},{7,8,9}}
123
456
789
最小路径为:1--2--3--6--9
所以最小数字和为:1+2+3+6+9=21思路:定义一个和题目数组同大小的二维数组,先为第一行和第一列赋值,然后后面的值等于网格当前值加上二维数组上面和右面的最小的值。
代码如下:
package com.suanfa.list;
public class DTGHmin {
private static int longhe(int[][] arr) {
int row = arr.length;
int col = arr[0].length;
int[][] sum = new int[row][col];
sum[0][0] = arr[0][0];
//第一行赋值
for (int i = 1; i < row; i++) {
sum[i][0] = sum[i-1][0]+arr[i][0];
}
//第一列赋值
for (int i = 1; i < col; i++) {
sum[0][i] = sum[0][i-1]+arr[0][i];
}
//后面的值等于网格当前值加上二维数组上面和右面的最小的值
for (int i = 1; i < row; i++) {
for (int j = 1; j < col; j++) {
if (sum[i-1][j] > sum[i][j-1]) {
sum[i][j] = sum[i][j-1]+arr[i][j];
}else {
sum[i][j] = sum[i-1][j]+arr[i][j];
}
}
}
return sum[row-1][col-1];
}
//测试一下~
public static void main(String[] args) {
int arr[][] = new int[][] {{1,2,3},{4,10,88},{7,8,9}};
System.out.println(longhe(arr));
}
}
-
运行结果:
image.png