第四章:多维数组和矩阵 ------------- 4.8 子矩阵的最大累加和

Kadane算法与前缀和:二维矩阵最大子矩阵和的高效解法 在数据处理和算法设计中,寻找连续子数组的最大和是一个经典问题,通常通过Kadane算法高效解决。其核心原理是动态规划,通过维护局部最优解来避免重复计算,从而将时间复杂度从O(n²)降至O(n)。这一思想在工程实践中价值显著,尤其在处理多维数据时,常需进行降维处理。前缀和作为一种基础预处理技术,能快速计算任意区间和,是优化多维查询的关键。结合Kadane算法与前缀和思想,可以将二维矩阵的最大子矩阵和问题转化为多个一维问题,通过枚举上下边界并压缩列和,将时间复杂度优化至O(n²m),广泛应用于图像处理、金融分析 阅读详情

题目:

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

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

 思路:

解法一:暴力破解,查找出所有的子矩阵,时间复杂度太高了,不可取。
解法二:假定只有一行,那就跟求最大和子数组一样。
              如果限定两行,可以把两行按列求和,
              同上所有我们从把第一行当做起点,依次累加后面的每一行后,都求一个最大子数组和 。
              以第二行作为起点,依次累加后面的每一行后,都求一个最大子数组和 每次求出来的和与历史最大值比较,如果更大,则更新 。
Arrays.fill(arr, 0);//快速地将arr的每个元素都设定为0。

代码:

import java.util.Arrays;

public class MaxSubMatrix {

    static int maxSum(int [][]matrix){
        int beginRow = 0;// 以它为起始行
        
        final int M = matrix.length;
        final int N = matrix[0].length;
        
        int []sums = new int[N]; // 按列求和
        int max = 0;  // 历史最大的子矩阵和
        while(beginRow<M){  
            for (int i = beginRow; i < M; i++) {
                // 按列累加
                for (int j = 0; j < N; j++) {
                    sums[j] += matrix[i][j];
                }
                // 累加完成,调用上一篇博客求最大子数组累加和的方法
                int t = MaxSubArray.findByDp(sums);
                if (t>max) {
                    max = t;
                }
            }
            //另起一行,作为起始行,sums 清零
            Arrays.fill(sums, 0);  // 快速地将sums的每个元素都设定为0
            beginRow++;
        }
        return max;
    }
    
    public static void main(String[] args) {
        int[][] matrix = {
                {-90, 48, 78},
                {64, -40, 64},
                {-81, -7, 66}
            };
            matrix = new int[][]{{1, 2, -1}};
            int res = maxSum(matrix);
            System.out.println(res);
    }

}

结果:

来源:https://www.cnblogs.com/xiaoyh/p/10295486.html

金仓数据库KCM认证考试介绍【2025年4月更新】 金仓数据库认证资深专家KCM认证考试介绍 阅读详情

相关推荐

Python量化投资入门教程:从零构建你的第一个交易策略

量化投资教程以数学模型和计算机程序实现超额收益,选用Python工具链完成数据获取、策略构建及回测。通过移动平均线交叉策略示例,展示数据预处理、信号生成、收益计算及可视化全流程,结合收益率、最大回撤和夏普比率评估策略,并建议参数优化与策略融合提升稳健性。

ylmx5201314的博客 2458

二维最大子矩阵和:前缀和与Kadane算法的降维应用

前缀和是一种基础的数据预处理技术,通过构建累积和数组,能够在常数时间内查询任意区间的和,其核心原理是以空间换时间。Kadane算法则是动态规划的经典应用,通过贪心决策在线性时间内解决一维最大子数组和问题,体现了局部最优解如何导向全局最优解。这两种技术的结合,为解决二维及更高维度的区间最值问题提供了高效思路,其技术价值在于将O(n²m²)的暴力复杂度优化至O(min(m,n)²*max(m,n)),实现了从不可行到可行的质变。在图像处理、金融数据分析、生物信息学等场景中,快速定位矩阵中元素和最大的连续子区域是

weixin_34055787的博客 413

无人机频谱侦测与智能识别技术实战解析

本文深入解析无人机频谱侦测与智能识别技术实战应用,涵盖无线电侦测、信号处理和定位技术等核心内容。通过频谱分析、特征提取和机器学习算法优化,实现高精度无人机识别与定位,并分享复杂环境下的应对策略和系统集成经验。

weixin_28419039的博客 490

经典算法——子矩阵的最大累加和问题

一、题目要求 给定一个矩阵matrix,其中的值有正有负,有0,返回子矩阵的最大累加和,例如,矩阵matrix为: -90 48 78 64 -40 64 -81 07 66 其中,最大累加和的子矩阵为: 48 78 -40 64 -7 66 所以返回累加和209 二、解题思路 将矩阵matrix[N][N]的每一列的N个元素累加成一个累加数组,然后求出这个数

henryzhihua 3452

欧姆龙SYSMAC STUDIO如何与基恩士SR-1000进行EIP通信

简要介绍一下扫码枪和欧姆龙sysmac的配置

weixin_42031602的博客 4788

泛微OA自定义post接口和路径(无侵入)

泛微OA自定义post接口和路径(无侵入)

技术分享 3876

9.3.3 二维数组最大值 (20分)

编程求出一个m行n列矩阵中最大值,以及其所在的行号和列号(从0开始),输入的元素各不相同。 输入格式: 输入在第1行中给出m,n(1≤m≤20,(1≤n≤20),在第2~m+1行中每行中给出n个整数,数字间以空格分隔。 输出格式: 第一行最大值 第二行最大值的行号 第三行最大值的列号 输入样例: 3 5 2 7 9 8 1 5 4 3 19 12 17 22 11 4 6 输出样例: 22 2 1 #include<stdio.h> int main() { int m,n,f,

MortyC99430的博客 5004

【Claude】Invalid API key 无效密钥报错已解决

API 拒绝了你提供的 key。最高频的根因是老的/被撤销的 key 藏在某处自动加载的配置文件里,而你对此不知情。→ 检查所有可能注入 key 的来源(.env.envrc、shell 配置、IDE 设置、)→ 清除无效来源 → 用/status验证。参考:Claude Code 官方《错误参考》"身份验证"章节、社区 Invalid API key 排查记录。

博客 7924

边界都是1的最大正方形大小

题目   给定一个N×N的矩阵matrix,在这个矩阵中,只有0和1两种值,返回边框全是1的最大正方形的边长长度。   例如:   0 1 1 1 1   0 1 0 0 1   0 1 0 0 1   0 1 0 1 1   其中,边框全是1的最大正方形的大小是4*4,返回4。 基本思路  比较容易理解的方法: 矩阵中一共有N*N个位置。O(N2N2) 每一个位置都可以成为...

BUPT-WT的博客 317

Ubuntu24.04安装搜狗输入法详细教程

本章教程,介绍如何在Ubuntu24.04版本操作系统上安装搜狗输入法。

猿小白的博客 1万+

【零基础入门unity游戏开发——2D篇】SpriteEditor图片编辑器

【零基础入门unity游戏开发——2D篇】SpriteEditor图片编辑器

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2331

算法很美 笔记 4.多维数组与矩阵

4.多维数组与矩阵 题1 :顺时针打印二维数组 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5] 示例 2: 输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9...

xcsxchen 997

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

【算法很美】多维数组与矩阵

多维数组与矩阵1. 多维数组基础题● 顺时针打印二维数组● 零所在行列清零● Z字型打印矩阵2. 复杂解● 边界为1的最大字方阵● 编程返回子数组最大累加和● 求子矩阵最大累加和● 矩阵运算一、矩阵的加法与减法二、矩阵与数的乘法三、矩阵与矩阵的乘法 1. 多维数组基础题 ● 顺时针打印二维数组 一圈一圈的打印,每圈以 每圈左上角坐标和右下角坐标 为边界。 public static void print(int[][] matrix) { int leftUpRow = 0, leftUpCo

weixin_48434658的博客 724

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

DP动态规划--最大子矩阵和问题(最大子段问题的推广即二维最大子段和问题)-To the Max(POJ - 1050题解)

DP–最大子矩阵和问题(最大子段问题的推广,即二维最大子段和问题 )-To the Max POJ - 1050原题点这里 题目 Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located within the whole array. The sum of a rectangle is

retr0的博客 1393

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

多维数组和矩阵程序练习

顺时针打印二维数组: 题目: 顺时针打印二维数组。 例如:将如下数组: {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}} 输出为:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 思路: 可以先一圈一圈的打印。先打印外圈,再缩小边界范围循环打印内圈即可。打印的时候注意控制边界。 代码...

曹世宏的博客 825

【SSL 1056】最大子矩阵 (多维DP)

已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1∗1)子矩阵。比如,如下4∗4子矩阵的最大子矩阵是9 2-4 1-1 8这个子矩阵的大小是15。输入一个N∗N1<=N<=500的整数矩阵,每个数的范围在−127127之间。输出最大子矩阵的大小。15。

m0_73647951的博客 588

第四章 多维数组与矩阵

1、顺时针打印二维数组 package org.lanqiao.algo.elementary._04matrix; /** * 顺时针打印二维数组 输入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 输出 1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 */ public class Case...

h_666666的博客 377

[算法系列] 多维数组--超详细解答!!记几道经典的多维数组习题(顺时针打印矩阵,z字型打印矩阵等)

[算法系列] 多维数组–记几道经典的多维数组习题 1. 顺时针打印二维数组 传入一个二维数组 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 顺时针打印出: 1 2 3 4 8 12 16 15 14 13 9 5 6 7 8 12 11 10 分析: 有如下二维数组, 那么它具体打印顺序是像右面这样的: 按照 1…5...

lawfree的博客 3388

蓝桥杯算法课《算法最美》笔记——4.多维数组和矩阵

4. 多维数组基础题 4.1 顺时针打印二维数组 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16] 打印1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10 思路:一圈一圈的打印。 import java.util.ArrayList; import java.util.Arrays; public class 顺时针打印2维数组 { public static void m

m0_55846001的博客 316

nyoj44求最大和 最大矩阵和问题

简单矩阵dp问题。。。可以把多维矩阵化为一维求最大和。。。。。 简单来说就是可以把第一行和第二行相加。。。然后求最大和,,,第一第二第三相加求最大和等等。。。。然后再从第二行开始,吧第二行第三行相加求最大值,,, 第二第三第四相加的最大和。。。。等等等。。。依此类推。。。。。。。 题目如下。。。。 描述 给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这

nywsp的专栏 745

蓝桥杯-PREV26-最大子阵-DP

蓝桥杯-PREV26-最大子阵 问题描述   给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大。   其中,A的子矩阵指在A中行和列均连续的一块。 输入格式   输入的第一行包含两个整数n, m,分别表示矩阵A的行数和列数。   接下来n行,每行m个整数,表示矩阵A。 输出格式   输出一行,包含一个整数,表示A中最大的子矩阵中的元素和。 样例输入 3 3 -1 -4 3 3 4 -1 -5 -2 8 样例输出 10 样例说明   取最后一列,和为10。 数据规模和约定   对于

weixin_44167903的博客 200

动态规划——线性dp

线性dp

m0_73693552的博客 6304

Python 多维数组学习示例

本文介绍了Python中创建和操作多维数组的两种方法:原生嵌套列表和NumPy库。嵌套列表适合小型不规则数据,而NumPy数组则针对大型数值计算进行了优化,提供高效的向量化操作和丰富的数学函数。文章详细展示了两种方法的实现代码,包括数组创建、索引、运算和统计操作,并通过图像处理和学生成绩表等实际案例演示了多维数组的应用。性能比较显示NumPy在处理大规模数据时比原生列表快数百倍。NumPy的多维数组是数据科学和科学计算的基础工具。

狮子雨恋 414

多维数组处理

综上所述,MATLAB的多维数组处理功能非常强大,可以轻松处理各种科学和工程问题中的多维数据。MATLAB提供了丰富的多维数组运算功能,可以对多维数组进行元素级别的运算、矩阵运算和线性代数运算。% 修改B矩阵中第1行的所有元素为1, 2, 3, 4。MATLAB提供了灵活的索引和切片操作,可以对多维数组中的元素进行精确获取和操作。D = [A, B];

weixin_74815451的博客 572
上一篇: 第四章:多维数组和矩阵 ------------- 4.7 子数组最大累加和
下一篇: 第五章 字符串专题 ---------------- 5.1 题解:判断字符串有无重复字符
Estrellas_
博客等级 码龄9年 273粉丝 233原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值