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

原创 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;
    }
}


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

相关文章推荐

数组中最大子矩阵,最简便的解法

遇到一个好人,可以改变一生;遇到一本好书,又何尝不是呢?最近在翻阅 左程云先生的《程序员代码面试指南–IT名企算法与数据结构题目最优解》时就非常的有感悟。建议有这方面爱好的博友,也去观摩观摩。书中讲解...

poj1050-求二维数组子数组和的最大值

题意:给定一个二维数组,值有正有负,矩阵的规模不超过100*100,矩阵元素在-127到127之间,求该二维数组的一个子数组,使得该数组的元素之和在所有的子数组中是最大的。 解法一: 对整个矩阵进...

动态规划-最大子矩阵和

求输入一个矩阵的最大子矩阵和 输入 第1行:M和N,中间用空格隔开(2 <= M,N <= 500)。 第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开。(-10^9 ...

笔试面试算法经典--动态规划-最大子矩阵和(Java)

【题目】 给定一个矩阵 matrix,其中矩阵中的元素可以包含正数、负数、和0,返回子矩阵的最大累加和。例如,矩阵 matrix 为: 0 -2 -7 0 9 ...

HDOJ To The Max 1081【动态规划-详解求最大子矩阵】

To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot...
  • ydd97
  • ydd97
  • 2015-08-20 21:54
  • 664

动态规划——最长连续子序列和+最大子矩阵和

问题:给一列数n个,求最大连续子序列和(即连续的子序列中和最大的序列)   本文作者 凌风 (iaccepted) 拓展:给一个n*n的矩阵,求其中和最大的子矩阵(即所有子矩阵中和最大的阵) 首先...

动态规划-最大子矩阵和(ZOJ 1074 TO THE MAX )

题目有一个包含正数和负数的二维数组。一个子矩阵是指在该二维数组里,任意相邻的下标是1×1或更大的子数组。一个子矩阵的和是指该子矩阵中所有元素的和。 本题中,把具有最大和的子矩阵称为最大子矩阵。例如,...

0013算法笔记——【动态规划】最大子段和问题,最大子矩阵和问题,最大m子段和问题

1、最大子段和问题      问题定义:对于给定序列a1,a2,a3……an,寻找它的某个连续子段,使得其和最大。如( -2,11,-4,13,-5,-2 )最大子段是{ 11,-4,13 }其...

二维数组和最大的子矩阵

题目:给出一个 m*n 的二维矩阵(元素可为正可为负),求该二维矩阵的一个子矩阵,且此子矩阵中所有元素的和最大,并输出该矩阵的和。方法1: i到j行的数组相加,得到一个一维数组。在整个一维数组上求和...

求一个矩阵中最大的二维子矩阵(元素和最大)

转载:http://blog.csdn.net/zhanxinhang/article/details/6731134 题:求一个矩阵中最大的n==2的二维子矩阵(元素和最大).如:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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