【算法题】子矩阵问题(有连续1的最大矩形区域)

给定一个包含0和1的矩形区域,求出所有全1子矩阵中,1的个数最多的一个子矩阵的1数量。算法从底部开始统计连续1的个数,并遍历矩阵找到最大矩形。
摘要由CSDN通过智能技术生成
描述

给定一个矩形区域,每一个位置上都是1或0,求该矩阵中每一个位置上都是1的最大子矩形区域中的1的个数。

输入

输入第一行为测试用例个数。
每一个用例有若干行,第一行为矩阵行数n和列数m,下面的n行每一行是用空格隔开的0或1。

输出

输出一个数值。

输入样例 1

1
3 4
1 0 1 1
1 1 1 1
1 1 1 0

输出样例 1

6


解决思路

从矩形最底层行开始统计,将每个原来为1的位置修改为表示该列其下方(包括自己)连续1的个数。
遍历统计后矩阵的每一个非0位置,分别向左和向右来找到尽可能最多个连续1的矩形区域。

向左或向右遇到0就停下;
遇到比自己值小的就停下;(这里的值即为矩阵统计后的每个位置上的值)

最后选出最大的。

实现
import java.util.Scanner;

public class SubMatrix {
   

    public static void main(String[] args) {
   
        Scanner scanner = new Scanner(System.in);
        int numOfCases = scanner.nextInt();  // 测试用例数量
        // 对每个测试用例的处理
        for (int i = 0; i < numOfCases; i++) {
   
            int rows = scanner.nextInt();   // 行数
            int columns = scanner.nextInt();    // 列数
            int[][] matrix = new int
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值