题目来源:腾讯2012年暑期实习生招聘面试二面试题题目描述:

在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最大是指元素1的个数最多。

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入的第一行是两个整数m、n(1<=m、n<=1000):代表将要输入的矩阵的大小。
矩阵共有m行,每行有n个整数,分别是0或1,相邻两数之间严格用一个空格隔开。

输出:

对应每个测试案例,输出矩阵中面积最大的全1子矩阵的元素个数。

样例输入:
2 2
0 0
0 0
4 4
0 0 0 0
0 1 1 0
0 1 1 0
0 0 0 0
样例输出:
0
4

思路:刚开始看这道题时,想到的是用求最大子矩阵的和的方法,不过该算法的复杂度是O(n^3),显然这道题不适合用这个方法。这题只能用O(n^2)的方法才行。这时可以一行一行地推,设置一个h[i]代表从第一行到当前行,第i列的连续0的个数(当前行第i列为0)。设置l[],r[]数组代表某行高度为>=h的左右边界。则对于0 1 0 1 00 0 0 0 00 0 0 0 11 0 0 0 00 1 0 0 0来说,h[]为别为1 0 1 0 12 1 2 1 23 2 2 2 00 3 4 3 11 0 5 4 2对每一列的h[]值可以更新左右边界l[],r[]每一行初始l[j],r[j]都设为j。对于每一行依次从左到右,如果h[j]<=h[l[j]-1],那么l[j]=l[l[j]-1].相应的,对于每一行依次从右到左,如果h[j]<=h[r[j]+1],则r[j]=r[r[j]+1].则对每一行的记录的h[]和l[],r边界可以计算出从以第i行为结尾的最大面积Si=h[j]*(r[j]-l[j]+1) (1<=j<=n)最后,取这个面积的最大值。代码如下:

 1 #include <stdio.h>
 2 #include <string>
 3
 4 int m, n;
 5 int data;
 6 int h[1005], lw[1005], rw[1005];
 7 int ans;
 8
 9 int main(void)
10 {
11     while (scanf("%d%d", &m, &n) != EOF)
12     {
13         int i, j;
14
15         for (i = 1; i <= n; i ++)
16             h[i] = 0;
17         ans = 0;
18         for (i = 1; i <= m; i ++)
19         {
20             for (j = 1; j <= n; j ++)
21             {
22                 lw[j] = rw[j] = j;
23                 scanf("%d", &data);
24                 if (data)
25                     h[j] ++;
26                 else
27                     h[j] = 0;
28             }
29             for (j = 1; j <= n; j ++)
30             {
31                 while (h[j] && lw[j] - 1 >= 1 && h[j] <= h[lw[j] - 1])
32                     lw[j] = lw[lw[j] - 1];
33                 while (h[n - j + 1] && rw[n - j + 1] + 1 <= n && h[n - j + 1] <= h[rw[n - j + 1] + 1])
34                     rw[n - j + 1] = rw[rw[n - j + 1] + 1];
35             }
36             for (j = 1; j <= n; j ++)
37                 if (h[j] && h[j] * (rw[j] - lw[j] + 1) > ans)
38                     ans =  h[j] * (rw[j] - lw[j] + 1);
39         }
40         printf("%d\n", ans);
41     }
42     return 0;
43 }

View Code

面积最大的全1子矩阵相关推荐

  1. 力扣--统计全1子矩阵

    力扣–统计全1子矩阵 文章目录 力扣--统计全1子矩阵 一.题目描述 二.分析 方法一:枚举 三.代码 枚举方法的代码 一.题目描述 二.分析 方法一:枚举 首先很直观的想法,我们可以枚举矩阵中的每个 ...

  2. 【2019牛客暑期多校训练营(第二场) - H】Second Large Rectangle(单调栈,全1子矩阵变形)

    题干: 链接:https://ac.nowcoder.com/acm/contest/882/H 来源:牛客网 题目描述 Given a N×MN \times MN×M binary matrix. ...

  3. 计算矩阵中全1子矩阵的个数

    前言 最近被我大哥安利了一道算法题, 这道题说难, 还不至于我做不出来, 说简单吧, 我还想不到最优解, 等把最优解告诉我之后, 我还正好能理解. 我甚至曾经怯怯的认为, 这题就是我哥专门给我找的, ...

  4. 【周赛总结】第196场周赛——全一子矩阵,交换k次的最小整数

    2020/07/05 未参赛,AC 3/4 第三题 全一子矩阵 思路参考最大矩形. 设计一个dp[i][j]表示以i,j为右下角的矩阵的最大值,我们需要枚举宽度和高度,但是我们可以通过预先设计一个矩阵 ...

  5. LC5454.统计全1子矩阵(矩阵统计)

    问题 解题 技巧:矩阵枚举上下边界,用一个sum维护上下边界内每一列的列和,压成一维数组 如果上下边界的差值diff等于这一列的列和sum,则这一列可以用来做矩阵 由于会存在连续并排的列,因此还需要一 ...

  6. 2021年 秋招面试记录

    2021年 春招面试记录 大华 大华一面:7.13 list.map.set IOC.AOP 单例模式 在哪使用 过滤? 提取数字+排序 大华二面: 7.27 mybatis缓存 二级缓存有什么问题 ...

  7. 清北学堂noip2019集训D2——数据结构

    基本数据结构 栈 STL:stack 定义:stack a; 查询堆顶:a.top(); 压入栈顶:a.pop(); 查询a中的元素个数:a.size(); 清空只能慢慢pop. 例题1 给定一个栈, ...

  8. 数据结构算法与编程LeetCode题解

    1-50 1. 两数之和 class Solution { public:vector<int> twoSum(vector<int> x, int y); };vector& ...

  9. 最大全0/1子矩阵的探究

    最大全0/1子矩阵的探究 by MedalPluS [问题模型] 给定一个n*n的矩阵,求矩阵中面积最大的一个值全是0或1的子矩阵 [分析] (这里n*n完全可以改为n*m,但由于种种原因,等下代码里 ...

最新文章

  1. samll note
  2. Android 隐藏软键盘
  3. gitee markdown 笔记_使用Gitee作为Markdown的图床
  4. 3.13. Notepad++中Windows,Unix,Mac三种格式之间的转换
  5. SAP Spartacus的double maintenance -使用Cherrypick进行维护工作
  6. 【LeetCode笔记】剑指 Offer 59 - II. 队列的最大值(Java、辅助队列)
  7. 在css使用PHP/ASP代码
  8. 微型计算机三总线是指,微机原理复习题(完整参考答案版)
  9. PHP 直接在共享内存中存储数据集
  10. python 魔法方法常用_12个常用的IPython魔法命令
  11. 回溯 Rust 2020:正在成为最受欢迎的编程语言
  12. Oracle:lsnrctl start Timeout or Adapter error
  13. 北京大学软件与微电子学院嵌入式系统工程系
  14. 【羊了个羊】什么!第二关难如上青天,能不能简单版??
  15. 基于pandas实现K折交叉验证数据集划分
  16. 用P、V操作解决进程同步问题的解题步骤
  17. Unity4.3.1引擎源码编译过程
  18. 如何将一个vector内容赋值给另一个vector C/C++
  19. 知名的网址导航网站及好用的网址导航分享
  20. 盘点微软使用火热的编程语言!程序员:你看我还有机会吗?

热门文章

  1. 「深度」在水下机器人开疆扩土之时,避免沦为泡沫应成为全行业重点
  2. linux mmap 详解【转】
  3. 【转】父类子类指针相互转换问题
  4. Property with #39;retain (or strong)#39; attribute must be of object type
  5. vs插件ZunKoIDE
  6. Css3从IE6-IE9的支持查看
  7. Android系统Surface机制的SurfaceFlinger服务的启动过程分析
  8. js 截取 前后 空格 获取字符串长度
  9. video processing on Mac and iOS
  10. 单网段DHCP服务器的架设