天津大学-23年夏令营上机测试-第2题-完美的矩阵

为了更好的阅读体检,可以查看我的算法学习网
在线评测链接:P1322

题目内容

01 01 01矩阵是计算机领域常用的矩阵,小 C C C喜欢在 01 01 01矩阵中寻找全 1 1 1的子矩阵,请你完成程序,可以求得一个矩阵中最大全 1 1 1子矩阵,并输出面积最大的全 1 1 1子矩阵中包含 1 1 1的个数。

输入

单组测试样例,第一行包含两个字母 m n m n mn,分别表示矩阵的行和列,接下来 m m m行每行 n n n个用空格分离的数字,表示 01 01 01矩阵中的元素。

输出

输出包括一个数字,表示面积最大全 1 1 1子矩阵中 1 1 1的个数。

样例

输入

5 3
1 0 1
1 1 0
0 1 1
1 0 1
1 1 1

输出

3

提示
矩阵仅包含 0 0 0 1 1 1,数据保证( 1 ≤ m , n ≤ 500 1\leq m, n \leq 500 1m,n500).

思路:前缀和+单调栈

最暴力的做法

枚举矩阵的长和宽,然后枚举矩阵的左上角,这样计算出这个矩阵内 1 1 1 的数量是否等于矩阵的长×宽。枚举长和宽,然后枚举矩阵左上角,总时间复杂度为 O ( n 2 m 2 ) O(n^2m^2) O(n2m2),至于计算矩阵内 1 1 1 的数量,可以通过预处理二维前缀和,然后 O ( 1 ) O(1) O(1) 计算得到。

简化问题

如果将问题转换为一个一维的问题,即给定一个长度为 m m m 的数组 h h h,第 i i i 个柱子的高度为 h i h_i hi ,宽度为 1 1 1 ,求这 m m m 个柱子可以勾勒出的矩形的最大面积。这是道LeetCode原题 84. 柱状图中最大的矩形

此时我们可以枚举以每个柱子为最低高度,找到第 i i i 个柱子左边第一个比其高度低的柱子 l l l ,找到的 j j j 个柱子右边比其高度低的柱子 r r r 。即 l < i , h l < h i l < i, h_l < h_i l<i,hl<hi r > i , h r > h i r > i, h_r>h_i r>i,hr>hi。这样以第 i i i 个柱子高度为矩形高度的宽度为 r − l − 1 r-l-1 rl1 。面积为 ( r − l − 1 ) × h i (r-l-1)\times h_i (rl1)×hi

时间复杂度为: O ( m 2 ) O(m^2) O(m2)

完整思路以及代码见网站内部(文章顶部):塔子哥的文字题解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔子哥学算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值