和最大子矩阵

题目描述

给定一个二维整数矩阵
要在这个矩阵中 选出一个子矩阵
使得这个子矩阵内所有的数字和尽量大
我们把这个子矩阵成为“和最大子矩阵”
子矩阵的选取原则,是原矩阵中一段相互连续的矩形区域

输入描述

输入的第一行包含两个整数N,M
(1 <= N,M <= 10)
表示一个N行M列的矩阵
下面有N行 每行有M个整数
同一行中每两个数字之间有一个空格
最后一个数字后面没有空格
所有的数字得在-1000 ~ 1000之间

输出描述

输出一行,一个数字
表示选出的“和最大子矩阵”内所有数字的和

示例一

¶输入

3 4
-3 5 -1 5
2 4 -2 4
-1 3 -1 3

输出

20

java代码

 public static void main(String[] args) {
        try (Scanner scanner = new Scanner(System.in)) {
            String[] split = scanner.nextLine().split(" ");
            int N = Integer.parseInt(split[0]);
            int M = Integer.parseInt(split[1]);
            int[][] matrix = new int[N][M];
            for (int i = 0; i < N; i++) {
                String[] nums = scanner.nextLine().split(" ");
                for (int j = 0; j < nums.length; j++) {
                    matrix[i][j] = Integer.parseInt(nums[j]);
                }
            }

            int res = solution(N, M, matrix);
            System.out.println(res);
        }
    }

    private static int solution(int n, int m, int[][] matrix) {
        int res =0;
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                //i为 n的长度 ,j为m的长度 做全排列
                int max =slove(i,j,n,m,matrix);
                res=Math.max(res,max);
            }
        }

        return res;
    }

    private static int slove(int a, int b, int n, int m,int[][] matrix){
        int sum =0;

        for (int i = 0; i <= n - a; i++) {
            for (int j = 0; j <= m - b; j++) {
                int sum4=0;
                //根据长度得到的和值 例如2X2 的所有值比较
                for (int k = 0; k < a; k++) {
                    for (int l = 0; l < b; l++) {
                        sum4 += matrix[i+k][j+l];
                    }
                }
                if(sum4>sum){
                    sum =sum4;
                }

            }
        }
        return  sum;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值