题目
思路
这道题其实是这道的进阶版,相比上一道,其实就是加了一个分层的考虑,我们依次处理每一层,如果该层第i位为0,显然无法通过该层第i位组成矩阵,否则以该位为基准的矩阵高度+1。我们在每一层都进行一次单调栈就可以求出以该层为底的最优解,在每层最优解中取最大值即可。
code:
#include<iostream>
#include<stack>
#include<cstdio>
using namespace std;
long long n,m,a[100005],ans,x,ans2,t,r,u,i,j;
struct f{
long long g,k;
} yy;
stack<f> o;
int main()
{
while (cin>>n>>m)
{
ans=0;
ans2=0;
for (j=1;j<=m;j++) a[j]=0;
for (j=1;j<=n;j++)
{
for (i=1;i<=m;i++) scanf("%lld",&x),(x==1?a[i]+=x:a[i]=0);
for (i=1;i<=m;i++)
{
r=0;
while (!o.empty()&&o.top().g>=a[i])
{
t=(r+o.top().k)*o.top().g;
ans2=max(t,ans2);
r+=o.top().k;
o.pop();
}
yy.k=r+1,yy.g=a[i];
o.push(yy);
}
r=0;
while (!o.empty())
{
t=(r+o.top().k)*o.top().g;
ans2=max(t,ans2);
r+=o.top().k;
o.pop();
}
ans=max(ans2,ans);
}
printf("%lld\n",ans);
}
return 0;
}