【POJ 3494】Largest Submatrix of All 1’s【单调栈】

在这里插入图片描述


解题思路

参照 Largest Rectangle in a Histogram那道题,这道题算是一个升级版,也就是二维的。
预处理每一列中每个位置上矩阵的高,记为f,设1为一个单位高度,样例如下图:
在这里插入图片描述
然后枚举矩阵内每个点,相当于以每一行为低,f[]i[j],为那一位上的高,然后用单调栈算这一行为底能组成的最大的面积


代码

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cmath>
#include<cstring>
#define ll long long
using namespace std;

ll m,n,s,t,maxn,ans,f[2100][2100],a[2100][2100];

struct c {
	ll x,y,w;
} st[2100];

int main() {
	while(scanf("%lld%lld",&m,&n)!=EOF) {
		ans=0;
		for(int i=1; i<=m; i++) {
			for(int j=1; j<=n; j++) {
				scanf("%lld",&a[i][j]);
			}
		}
		for(int j=1; j<=n; j++) {
			for(int i=1; i<=m; i++) {
				if(a[i][j]==1)
					f[i][j]=f[i-1][j]+1;
				else f[i][j]=0;
			}
		}
		for(int i=1; i<=m; i++)
			f[i][n+1]=-1;
		for(int i=1; i<=m; i++) {
			t=0;
			memset(st,0,sizeof(st));
			for(int j=1; j<=n+1; j++) {
				s=0;
				while(f[i][j]<=f[st[t].x][st[t].y]&&t>0) {
					maxn=f[st[t].x][st[t].y]*(st[t].w+s);
					ans=max(ans,maxn);
					s+=st[t].w;
					t--;
				}
				st[++t]=(c) {
					i,j,s+1};
			}
		}
		printf("%lld\n",ans);
	}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值