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

原创 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/zhanxinhang/article/details/6731134 题:求一个矩阵中最大的n==2的二维子矩阵(元素和最大).如:...
  • jtlyuan
  • jtlyuan
  • 2012年04月16日 22:08
  • 9760

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

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

【动态规划DP,二维动归】poj1651,Multiplication Puzzle

http://poj.org/problem?id=1651 有N张写有数字的卡片排成一行,按一定次序从中拿走N-2张(第1张和最后一张不能拿),每次只拿一张,取走一张卡片的同时,会得到一个...
  • mmc2015
  • mmc2015
  • 2015年08月06日 19:46
  • 1328

高效面试之动态规划DP

解题关键: 理解结构特征,抽象出状态,写成状态转移方程。 题目索引 1.三角形找一条从顶到底的最小路径 分析 设状态为 f (i; j ),表示从从位置 (i; ...

【算法之动态规划(一)】动态规划(DP)详解

一、基本概念 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E...
  • cangchen
  • cangchen
  • 2015年04月14日 17:09
  • 18035

最大子矩阵和(详解)

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

最大子矩阵和

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

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

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

【动态规划】求二维数组走法路径种数

问题给定二维数组,从左上走到右下的走法种树,数组中1代表该格可以走,0代表不能走。且只能向下和向右走。解法典型的动态规划问题:dp[i][j]表示从[0][0]到[i][j]的走法数量。 状态转移方程...

二维数组最大面积的问题(动态规划)

求矩阵最大方阵面积
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【动态规划】求二维矩阵的最大和子矩阵
举报原因:
原因补充:

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