• 和最大连续子串续——和最大连续子矩阵


    继上一节学习了和最大连续子串,推广到和最大连续子矩阵,以二维为例,子矩阵是矩阵行和列的组合,参考: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

  • 相关阅读:
    SQL_server 将表中的记录 转换成 Insert(插入) SQL 语句
    Delphi DBGridEh导出Excel
    hdu 2018 母牛的故事
    hdu 2084 数塔
    hdu 2190 重建希望小学
    hdu 2501 Tiling_easy version
    hdu 2046 骨牌铺方格
    hdu 2045 不容易系列之(3)—— LELE的RPG难题
    高精度模板
    各种平面分割问题总结(转)
  • 原文地址:https://www.cnblogs.com/yuwenfeng/p/4121671.html
Copyright © 2020-2023  润新知