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

题目描述:

有一个正整数和负整数组成的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;imax)?maxSubArray(temp,n):max;
        	 //temp开始往下加第二行,第三行...
             for(int j = i+1;jmax)?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;imax)
        		max = sum;
    	}
    	return max;
    }
}


你可能感兴趣的:(ACM)