Java-最小路径之和(给定一个只含非负整数的m*n的网格,找到一条可以使从左上角到右下角的数字和最小的路径。)

  • 题目:给定一个正整数的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

你可能感兴趣的:(Java-最小路径之和(给定一个只含非负整数的m*n的网格,找到一条可以使从左上角到右下角的数字和最小的路径。))