zoukankan      html  css  js  c++  java
  • 和最大连续子串续——和最大连续子矩阵

    继上一节学习了和最大连续子串,推广到和最大连续子矩阵,以二维为例,子矩阵是矩阵行和列的组合,参考:http://blog.sina.com.cn/s/blog_a782701501016636.html

    代码如下:

    package programming;
    
    /**最大和的连续子矩阵
     * 将连续子矩阵看做是一维连续子串,然后利用和最大连续子串方法,求出连续子串,进而求出子矩阵
     * @author ywf
     *
     */
    public class MaxSumSubMatrix {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            int[][] A =  {{0, -2,  -7,  0},
                      {9 , 2 , -6,  2},
                      {-4 , 1 ,-4 , 1},
                      {-1 , 8 ,  0 ,-2}};
            int[] temp = new int[A[0].length];
            int subMaxSum = Integer.MIN_VALUE;
            int colStart = -1;
            int colEnd = -1;
            int rowStart = -1;
            int rowEnd = -1;
            //矩阵压缩
            for(int i = 0 ;i<A.length;i++){            
                for(int j = i;j<A[i].length;j++){
                    for(int h = i;h<=j;h++){
                        for(int k = 0;k<temp.length;k++){                        
                                temp[k] += A[h][k];                                        
                        }
                    }
                    int[] tempMax = getResult4(temp);
                    if(tempMax[2]>subMaxSum){
                        subMaxSum = tempMax[2];
                        colStart = tempMax[0];
                        colEnd = tempMax[1];
                        rowStart = i;
                        rowEnd = j;
                    }
                    temp = new int[A[0].length];
                }            
            }
            //输出和最大子矩阵
            for(int i = rowStart;i<=rowEnd;i++){
                for(int j = colStart;j<=colEnd;j++){
                    System.out.print(A[i][j]+" ");
                }
                System.out.println();
            }
            System.out.println("sum:"+subMaxSum);
    
        }
        public static int[] getResult4(int[] array) {
            int[] result = new int[3];
            int rmax = Integer.MIN_VALUE;//当前最大的和
            int sum = Integer.MIN_VALUE;//当前的和
            int start = -1;//最大子串的起始下标
            int end = -1;//最大子串的结束下标
            for (int i = 0; i < array.length; i++) {
                if (sum > 0) {
                    sum += array[i];
                } else {
                    sum = array[i];
                    if(sum>rmax){
                        start = i;
                    }                
                }
                if (sum > rmax) {
                    rmax = sum;
                    end = i;
                }
    
            }
            result[0] = start;
            result[1] =end ;
            result[2] = rmax;
            return result;
        }
    }

     http://yunpan.cn/cyRA3J9ztrG5N  提取码 d68b

  • 相关阅读:
    别人走的路-1
    抽象类跟接口的区别
    一个类实现多个接口的demo
    servlet+jdbc+javabean其实跟ssh差不多
    什么是shell
    设置cookie倒计时让让表单自动提交
    变量、基本数据类型
    编程语言、添加环境变量、变量
    Java优先队列一些问题
    JavaScript学习-JSON
  • 原文地址:https://www.cnblogs.com/yuwenfeng/p/4121671.html
Copyright © 2011-2022 走看看