【动态规划】求二维矩阵的最大和子矩阵

原创 2016年05月30日 21:06:14

题目描述:

有一个正整数和负整数组成的NxN矩阵,请编写代码找出元素总和最大的子矩阵。请尝试使用一个高效算法。
给定一个int矩阵mat和矩阵的阶数n,请返回元素总和最大的子矩阵的元素之和。保证元素绝对值小于等于100000,且矩阵阶数小于等于200。


测试用例:

[[1,2,-3],[3,4,-5],[-5,-6,-7]],3

返回:

10


题目解析:

把二维数组最大子矩阵和 转换成 一维数组的最大子数组:
把二维数组M x N 每一行分别相加,就可以得出一个一维数组(长度为N),
这个一维数组的最大子数组和就是原矩阵中包含M行X列的一个最大子矩阵和,
这样只用枚举出原N x N 矩阵的所有 M x N的子矩阵的最大子矩阵和,
就可以得出最后结果


我的代码:

import java.util.*;

public class SubMatrix {
     /**
     * 求矩阵的最大子矩阵的和
     * 思路是将二维的矩阵化为一维的数组,求一维数组的最大连续子序列的和
     * @param mat 二维矩阵n*n
     * @param n 矩阵的阶数
     * @return 返回最大子矩阵的和
     */
    public int sumOfSubMatrix(int[][] mat, int n) {
    	int[] temp = new int[n];
    	//初始化
        for(int i = 0;i<n;i++)
            temp[i] = 0;
        int max = Integer.MIN_VALUE;
        
        //从第一行开始往下加...从第二行开始往下加......从第n行开始往下加
         for(int i  = 0;i<n;i++){
        	 //temp只加了一行
        	 temp = mat[i];
        	 max = (maxSubArray(temp,n)>max)?maxSubArray(temp,n):max;
        	 //temp开始往下加第二行,第三行...
             for(int j = i+1;j<n;j++){
            	 for(int k = 0;k<n;k++){
            		 temp[k] +=mat[j][k];
            	 }
            	 //每加完一行之后,比较一下最大值
            	 max = (maxSubArray(temp,n)>max)?maxSubArray(temp,n):max;
             }
         }
    	return max;
    }
    
    /**
     * 求一位数组的最大连续子序列的和
     * @param array 传递进去的一位数组
     * @param n 数组的长度
     * @return 返回连续最大连续子序列的和
     */
    public  int maxSubArray(int[] array,int n){
    	int sum = 0;
    	int max = Integer.MIN_VALUE;
    	for(int i = 0;i<n;i++){
            sum+=array[i];
            if(sum<0)
                sum=0;
        	if(sum>max)
        		max = sum;
    	}
    	return max;
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

最大子矩阵和(详解)

转载自:http://blog.csdn.net/beiyeqingteng 前言: 今天花了很长时间,看了无数人写的帖子,但是几乎没有人把这个问题一下子说得很清楚,所以,我把这个问题按照自己的思...
  • kavu1
  • kavu1
  • 2016年01月20日 11:33
  • 4768

ACM-最大子矩阵和

最大子矩阵和问题是对最大子序列和问题的扩展,即从一维扩展到了二维。但是解决此问题的方法和原来的方法并没有太大的差别,这里就以同样的动态规划的实录思路来求解此问题。原来subSum[i]代表包含ai并且...
  • u011787119
  • u011787119
  • 2015年03月30日 23:40
  • 1429

最大子矩阵和

最大子矩阵和
  • fengyingjie2
  • fengyingjie2
  • 2017年01月14日 16:20
  • 701

【最大子矩阵和】HDU1559-最大子矩阵

最大子矩阵 Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...
  • u013517797
  • u013517797
  • 2014年08月15日 17:08
  • 6389

最大子矩阵(子矩阵大小固定)

E - 最大子矩阵 Time Limit:10000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit S...
  • hz18790581821
  • hz18790581821
  • 2016年08月16日 17:52
  • 591

最大子矩阵和

前言: 今天花了很长时间,看了无数人写的帖子,但是几乎没有人把这个问题一下子说得很清楚,所以,我把这个问题按照自己的思路写出来,希望能够把这个问题讲清楚。 问题: 求一个M*N的矩阵的最大子矩阵...
  • beiyeqingteng
  • beiyeqingteng
  • 2011年12月09日 13:32
  • 24051

最大子矩阵——NYOJ104

给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。  这个问题就是最大值子区间和的二维问题。 最大子区间和...
  • u013710356
  • u013710356
  • 2014年08月03日 13:55
  • 484

O(N^3)找最大子矩阵Submatrix

其实这个方法是从找最大子序列演化过来的 找最大子序列的话,最直接的方法是确定左右边界,然后把这之间的加起来,与当前最大值比较,这样做法复杂度为O(N^3) 稍微优化一下的话,是确定一边,然后一个一...
  • SteelBasalt
  • SteelBasalt
  • 2015年09月26日 22:44
  • 912

最大子矩阵和问题

给定一个长度为n的一维的数组matrix[n],让求其最大matrix[i] + matrix[i+1] + ... + matrix[j] = sum问题? 简单算法:穷举法先预处理map[n]表示...
  • jeiwt
  • jeiwt
  • 2010年05月06日 08:48
  • 7033

最大子段和||最大子矩阵和||最大全1子矩阵||最大全1子正方形||

最大子段和 给定n个整数组成的序列A[0,1,…,n-1],求该序列子段的最大和。算法一枚举所有可能的左右边界l,r,计算sum[l,...r],算法复杂度为O(n^3) 算法二sum[l,...r...
  • whzyb1991
  • whzyb1991
  • 2015年08月18日 19:15
  • 1965
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【动态规划】求二维矩阵的最大和子矩阵
举报原因:
原因补充:

(最多只允许输入30个字)