最大和

题目:给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
例子:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
其最大子矩阵为:
9 2
-4 1
-1 8
其元素总和为15。
思路:首先如果是一维数组求最大和,sum为记录区间之间的和,那么从第0个元素开始加起。如果sum<0的话,就将sum置0,并重新开始从这一点开始加起。如果sum>0的话,就继续向右加。那么可不可以推广到二维数组呢。也可以这么想如何将二维数组转换成一维数组。将m行到k行的数组元素按列相加,就得到了一个一维数组,再按此求二维数组的最大和
这里写图片描述

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int t=in.nextInt();
        while (t-->0) {
            int m=in.nextInt();
            int n=in.nextInt();
            int arr[][]=new int[m+1][n];
            for (int i = 1; i <=m; i++) {
                for (int j = 0; j < n; j++) {
                    arr[i][j]=in.nextInt();
                    arr[i][j]=arr[i][j]+arr[i-1][j];
                }
            }
            int count=0;
            for (int i = 1,c=arr[1][0]; i <=m; i++) {
                for (int j = i; j <=m; j++) {
                    for (int k = 0,max=0; k < n; k++) {
                        int temp=arr[j][k]-arr[i-1][k];
                        max=(max>=0?max:0)+temp;
                        c=max>c?max:c;
                        count=c;
                    }
                }
            }
            System.out.println(count);
        }
        // TODO Auto-generated method stub

    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值