当前位置: 首页 > article >正文

子矩阵最大累加和

题目描述

给定一个矩阵matrix,其中的值有正、有负、有0,返回子矩阵的最大累加和。
例如,matrix为
-1 -1 -1
-1 2 2
-1 -1 -1
其中最大累加和的子矩阵为:
2 2
所以返回4.

解题思路

在这里插入图片描述

拿前两行举个例子:第一列-1+(-1)=-2,它不可能在最大子矩阵中(反证法:假设它在最大子矩阵中,把它丢弃岂不是更大)。第2列-1+2=1,有可能是最大值,做个记录。第3列与第2列的累加和-1+2+(-1+2)=2,有可能是最大值,再做个记录。一行和三行的情况也是同理。

package com.company;

import com.company.util.MatrixUtil;

public class Test5 {
    public static void main(String[] args) {
        /*int[][] A={
                {-1,-1,-1},
                {-1,2,2},
                {-1,-1,-1}
        };*/

        int[][] A=MatrixUtil.randomMatrix(3,3,-10,10);

        int max=Integer.MIN_VALUE;
        for (int i = 0; i < A.length; i++) {
            for (int j = i; j < A.length; j++) {
                int num=matrix(A,i,j);
                max=num>max?num:max;
            }
        }
        MatrixUtil.printMatrix(A);
        System.out.println(max);
    }
    public static int matrix(int[][] A,int begin,int end){
        int sum=0;
        int max=Integer.MIN_VALUE;
        for (int i = 0; i < A[0].length; i++) {//列
            for (int j = begin; j <=end; j++) {//行
                sum+=A[j][i];
            }
            //如果sum<0,sum重置为0
            if(sum<0)
                sum=0;
            else
                max=sum>max?sum:max;
            //否则,有可能是最大值
        }
        return max;
    }


}

package com.company.util;

import java.util.Random;

public class MatrixUtil {
    public static void main(String[] args) {
        int[][] matrix=randomMatrix(3,3,0,10);
        printMatrix(matrix);
    }
    public static int[][] randomMatrix(int row,int col,int min,int max){
        int[][] matrix=new int[row][col];
        for (int i = 0; i < row; i++) {
            matrix[i]=new int[col];
        }

        Random r=new Random();
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                int num=r.nextInt(max-min)+min;
                matrix[i][j]=num;
            }
        }

        return matrix;
    }
    public static void printMatrix(int[][] matrix){
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[0].length; j++) {
                if(j!=matrix[0].length-1)
                System.out.print(matrix[i][j]+",");
                else
                System.out.print(matrix[i][j]);
            }
            System.out.println();
        }
    }
}


http://www.kler.cn/a/428256.html

相关文章:

  • 以太网详解(六)OSI 七层模型
  • c语言中mysql_query的概念和使用案例
  • 当高兴、尊重和优雅三位一体是什么情况吗?
  • 顶刊JFR|ROLO-SLAM:首个针对不平坦路面的车载Lidar SLAM系统
  • LLM - 大模型 ScallingLaws 的设计 100B 预训练方案(PLM) 教程(5)
  • 代码工艺:实践 Spring Boot TDD 测试驱动开发
  • selenium+python实现12306自动化抢火车票(二)
  • 调度算法(2)
  • Spring Boot性能提升:实战案例分析
  • Android WebView加载本地html文件
  • python学习笔记—1—基础环境配置和字面量
  • Figma入门-旋转效果
  • 什么是Angular?
  • MySQL-SQL语句
  • Golang内存模型总结1(mspan、mcache、mcentral、mheap)
  • Windows系统修改文件的默认打开方式的3种方式
  • 隐式神经网络实现低光照图像增强
  • 《深入理解组件间数据同步:@Provide/@Consume与@Observed/@ObjectLink的特性及限制》
  • Github 2024-12-08 php开源项目日报 Top10
  • 常见函数的Taylor级数展开的可视化过程
  • React初体验 - [Next.js项目]
  • Hive 中 IP 字典的应用:让你的数据分析更加精准
  • 反爬虫机制的全面解析
  • 在做题中学习(79):最小K个数
  • 【Java】使用Socket手搓三次握手 从原理到实践
  • 代码随想录-算法训练营day36(贪心算法06:单调递增的数字,监控二叉树,总结)