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

来源:互联网 发布:激战2诺恩捏脸数据 编辑:程序博客网 时间:2024/06/02 04:15

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


解法:只需要遍历所有的行数组,将遍历的所有行数组相加,然后 产生一个新的数组,只要利用求子数组的最大和就可以求出所有行中子矩阵的最大值。

package Matrix;public class MaxSumofMatrix {    public static void main(String[] args) {        //最大子矩阵的累加和        int matrix[][]={{-1,-1,-1},{-1,2,2},{-81,-7,-1}};        maxSum(matrix);    }    public static void maxSum(int matrix[][])    {        if(matrix==null||matrix.length==0)            return;        int max=0;        int col=matrix[0].length,row=matrix.length;             for(int i=0;i<row;i++)        {            int arr[]=new int[col];            for(int j=i;j<row;j++)            {            //遍历所有的子行                for(int k=0;k<col;k++)                {                    arr[k]+=matrix[j][k];                    //将每子行的值进行相加然后利用子数组的最大和就可以求出子矩阵的最大和                }                max=Math.max(maxSum(arr), max);                //求出数组的子数组和最大值            }        }        System.out.println(max);    }    public static int maxSum(int arr[])    {        int max=0,sum=0;        for(int i=0;i<arr.length;i++)        {            if(sum<=0)            {                sum=arr[i];            }            else {                sum+=arr[i];            }            max=Math.max(sum, max);        }        return max;    }}
0 0
原创粉丝点击