子矩阵的最大累加和问题

【题目】

给定一个矩阵matrix,其中的值有正负0,返回子矩阵的最大累加和。

【举例】

例如,matrix为:
-90 48 78
64 -40 64
-81 -7 66
其中,最大累加和的子矩阵为:
48 78
-40 64
-7 66
所以返回209

matrix为:
-1 -1 -1
-1 2 2
-1 -1 -1
其中,最大累加和的子矩阵为:
2 2
所以返回累加和4

【代码】

public static void main(String[] args) {
        int[][] arr={{-90,48,78},{64,-40,64},{-81,-7,66}};
        System.out.println(maxSum(arr));//209
        int[][] arr1={{-1,-1,-1},{-1,2,2},{-1,-1,-1}};
        System.out.println(maxSum(arr1));//4

    } 

    //子矩阵的最大累加和问题
    public static int maxSum(int[][] m){
        if(m==null||m.length==0||m[0].length==0){//判断矩阵非空
            return 0;
        }
        int[] s=null;//累加数组
        int cur=0;
        int max=Integer.MIN_VALUE;
        for(int i=0;i!=m.length;i++){//从第i行元素开始,往下查找所有子矩阵
            s=new int[m[0].length];
            for(int j=i;j!=m.length;j++){
                cur=0;
                for(int k=0;k!=m[0].length;k++){
                    s[k]+=m[j][k];//每一步的累加数组(叠加每一列)
                    cur+=s[k];
                    max=Math.max(cur, max);//每一步的最大子矩阵的累加和
                    cur=cur>0?cur:0;
                }
            }
        }
        return max;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值