描述
给定一个矩形区域,每一个位置上都是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