编程题:最小矩阵路径

矩阵的最小路径和

给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。

考察点:数组、动态规划

思路:

到达一个点(i,j)我们可以选择从(i-1,j)下来,或者从(i,j-1)往右过来,那么到达(i,j)的最小路径和则是两者中小的那个。

解题:

构建最小路径和矩阵minL,返回矩阵右下角的值。

当i=0&&j=0:minL[i][j] = matrix[i][j]

当i=0:         minL[i][j] = minL[i][j-1]+matrix[i][j]

当j=0:         minL[i][j] = minL[i-1][j]+matrix[i][j]

当j>0&&j>0: minL[i][j] = minL[i-1][j]+matrix[i][j]和minL[i][j-1]+matrix[i][j]中的最小值

/**
     *左上角到右下角的最小矩阵和,只能向右向下
     * @param matrix int整型二维数组 the matrix
     * @return int整型
     */
    public int minPathSum (int[][] matrix) {
        // 到达每个点的最小路径和=min(左边点的最小路径和,右边的最小路径和)+自己本身的权
        //递归超时……使用数组存储以及循环
        if(matrix.length==0) return 0;
        if(matrix[0].length==0) return 0;
        //return  minPathSumofPoint(matrix,matrix.length-1,matrix[0].length-1);
        int[][] minl = new int[matrix.length][matrix[0].length];
        for(int i=0;i<matrix.length;i++){
            for(int j=0;j<matrix[i].length;j++){
                if(i==0&&j==0){
                    minl[i][j] = matrix[i][j];
                }
                else if(i==0){
                    minl[i][j] = minl[i][j-1]+matrix[i][j];
                }
                else if(j==0){
                    minl[i][j] = minl[i-1][j]+matrix[i][j];
                }
                else{
                    if(minl[i-1][j]<minl[i][j-1]){
                        minl[i][j] = minl[i-1][j]+matrix[i][j];
                    }
                    else{
                        minl[i][j] = minl[i][j-1]+matrix[i][j];
                    }

                }
            }

        }
        return minl[matrix.length-1][matrix[0].length-1];

    }

 public  int minPathSumofPoint(int[][] matrix,int i,int j){
        if(i<0||j<0){
            return -1;
        }
        if(i==0&&j==0){
            return matrix[0][0];
        }
        else if(i==0){
            //System.out.println(matrix[i][j]);
            return minPathSumofPoint(matrix,i,j-1)+matrix[i][j];
        }
        else if(j==0){
            //System.out.println(matrix[i][j]);
            return minPathSumofPoint(matrix,i-1,j)+matrix[i][j];
        }
        else{
            //System.out.println(matrix[i][j]);
            return Math.min(minPathSumofPoint(matrix,i,j-1)+matrix[i][j],minPathSumofPoint(matrix,i-1,j)+matrix[i][j]);
        }
    }
当你深入了解,你就会发现世界如此广袤,而你对世界的了解则是如此浅薄,请永远保持谦卑的态度。
原文地址:https://www.cnblogs.com/liwxmyself/p/14699048.html