zoukankan      html  css  js  c++  java
  • 编程题:最小矩阵路径

    矩阵的最小路径和

    给定一个 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]);
            }
        }
    当你深入了解,你就会发现世界如此广袤,而你对世界的了解则是如此浅薄,请永远保持谦卑的态度。
  • 相关阅读:
    取出某个月有几天
    重建索引时,一些数值
    java代理概念
    java内部类和静态内部类
    Lamdba表达式的代码使用讲解
    java 中Vector的使用详解
    mysql 安装失败 start service执行不下去
    Mysql中ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8怎么转换为sql sever2008的代码
    通过命令行发送邮件
    Servlet开发总结(一)
  • 原文地址:https://www.cnblogs.com/liwxmyself/p/14699048.html
Copyright © 2011-2022 走看看