【HDOJ6957】Maximal submatrix(单调栈,最大子矩阵面积)

举报
小哈里 发表于 2022/05/10 23:15:36 2022/05/10
【摘要】 1008 Maximal submatrix 题意: 给出一个n*m的矩阵,求一个面积最大的子矩阵满足子矩阵的每一列都是单调不递减的 思路: 转化为01矩阵 每个位置1代表该位是否比上面一位小,然...

1008 Maximal submatrix

题意:

  • 给出一个n*m的矩阵,求一个面积最大的子矩阵满足子矩阵的每一列都是单调不递减的

思路:

  • 转化为01矩阵 每个位置1代表该位是否比上面一位小,然后用单调栈求最大01矩阵 复杂度O(n^2)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 3e3+10;
int a[maxn][maxn], b[maxn][maxn], h[maxn];
int p, s[maxn], w[maxn];

int main(){
	ios::sync_with_stdio(false);
	int T;  cin>>T;
	while(T--){
		int n, m;  cin>>n>>m;
		for(int i = 1; i <= n; i++){
			for(int j = 1; j <= m; j++){
				cin>>a[i][j];
				if(i==1)continue;
				b[i][j] = (a[i][j]>=a[i-1][j]);
			}
		}
		int ans = 0;
		for(int i = 1; i <= n; i++){
			//统计高度
			for(int j = 1; j <= m; j++){
				if(b[i][j]==0)h[j] = 1;
				else h[j]++;
			}
			//单调栈
			p = 0;  h[m+1] = 0;
			for(int j = 1; j <= m+1; j++){
				if(h[j]>s[p])s[++p]=h[j], w[p] = 1;
				else{
					int width = 0;
					while(s[p]>h[j]){
						width += w[p];
						ans = max(ans, width*s[p]);
						p--;
					}
					s[++p] = h[j], w[p] = width+1;
				}
			}
		}
		cout<<ans<<"\n";
	}
	return 0;
}

文章来源: gwj1314.blog.csdn.net,作者:小哈里,版权归原作者所有,如需转载,请联系作者。

原文链接:gwj1314.blog.csdn.net/article/details/119782806

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。