您的位置:首页 > 其它

51nod 1158 全是1的最大子矩阵

2017-10-24 18:56 330 查看
题意:给出1个M*N的矩阵M1,里面的元素只有0或1,找出M1的一个子矩阵M2,M2中的元素只有1,并且M2的面积是最大的。输出M2的面积。

思路:单调栈最基础的应用是给你一排高度计算最大矩形面积,现在这题只要枚举每一行作为底,每一列为前(上)缀和,每次求下能形成的最大面积即可。

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3+5;
int a[maxn][maxn], sum[maxn][maxn], m, n;
int minl[maxn], minr[maxn];

int main(void)
{
while(cin >> m >> n)
{
memset(sum, 0, sizeof(sum));
for(int i = 1; i <= m; i++)
for(int j = 1; j <= n; j++)
{
scanf("%d", &a[i][j]);
if(a[i][j]) sum[i][j] = sum[i-1][j]+1;
else sum[i][j] = 0;
}
int ans = 0;
for(int row = 1; row <= m; row++)
{
stack<int> s;
while(!s.empty()) s.pop();
for(int i = 1; i <= n; i++)
{
while(s.size() && sum[row][s.top()] >= sum[row][i]) s.pop();
minl[i] = s.size()==0 ? 1 : (s.top()+1);
s.push(i);
}
while(!s.empty()) s.pop();
for(int i = n; i >= 1; i--)
{
while(s.size() && sum[row][s.top()] > sum[row][i]) s.pop();
minr[i] = s.size()==0 ? n : (s.top()-1);
s.push(i);
}
for(int i = 1; i <= n; i++)
ans = max(ans, sum[row][i]*(minr[i]-minl[i]+1));
}
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  51nod 单调栈