POJ3494 Largest Submatrix of All 1’s

题目

题目

思路

这道题其实是这道的进阶版,相比上一道,其实就是加了一个分层的考虑,我们依次处理每一层,如果该层第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;
}

猜你喜欢

转载自blog.csdn.net/weixin_49843717/article/details/114433328
今日推荐