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;
}
思路:单调栈最基础的应用是给你一排高度计算最大矩形面积,现在这题只要枚举每一行作为底,每一列为前(上)缀和,每次求下能形成的最大面积即可。
代码:
#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 1158 全是1的最大子矩阵
- 51nod-1158 全是1的最大子矩阵(单调栈)
- 51nod 1158 全是1的最大子矩阵
- 51nod 1158:全是1的最大子矩阵
- 51Nod - 1158 全是1的最大子矩阵 单调栈
- 51Nod-1158-全是1的最大子矩阵
- 51NOD 1158 全是1的最大子矩阵
- 51Nod 1158 全是1的最大子矩阵
- 51nod 1158 全是1的最大子矩阵 (暴力枚举)
- 51nod 1158 全是1的最大子矩阵
- 51Nod 1051 最大子矩阵和
- 51Nod-1157-全是1的最大子矩阵
- [51nod 1051 最大子矩阵和]前缀和+dp
- 51nod 1051 最大子矩阵和
- 51Nod 1051 最大子矩阵和
- [51nod 1158 全是1的最大子矩阵] 单调栈
- 51nod 1051 最大子矩阵和
- 【51Nod】1051 - 最大子矩阵的和(dp)
- 51nod 1051 最大子矩阵和
- 51nod 1051 最大子矩阵和