HDOJ6957Maximal submatrix(单调栈,最大子矩阵面积)
Posted 小哈里
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDOJ6957Maximal submatrix(单调栈,最大子矩阵面积)相关的知识,希望对你有一定的参考价值。
1008 Maximal submatrix
题意:
- 给出一个n*m的矩阵,求一个面积最大的子矩阵满足子矩阵的每一列都是单调不递减的
思路:
- 转化为01矩阵 每个位置1代表该位是否比上面一位小,然后用单调栈求最大01矩阵 复杂度O(n^2)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 3e3+10;
int a[maxn][maxn], b[maxn][maxn], h[maxn];
int p, s[maxn], w[maxn];
int main(){
ios::sync_with_stdio(false);
int T; cin>>T;
while(T--){
int n, m; cin>>n>>m;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
cin>>a[i][j];
if(i==1)continue;
b[i][j] = (a[i][j]>=a[i-1][j]);
}
}
int ans = 0;
for(int i = 1; i <= n; i++){
//统计高度
for(int j = 1; j <= m; j++){
if(b[i][j]==0)h[j] = 1;
else h[j]++;
}
//单调栈
p = 0; h[m+1] = 0;
for(int j = 1; j <= m+1; j++){
if(h[j]>s[p])s[++p]=h[j], w[p] = 1;
else{
int width = 0;
while(s[p]>h[j]){
width += w[p];
ans = max(ans, width*s[p]);
p--;
}
s[++p] = h[j], w[p] = width+1;
}
}
}
cout<<ans<<"\\n";
}
return 0;
}
以上是关于HDOJ6957Maximal submatrix(单调栈,最大子矩阵面积)的主要内容,如果未能解决你的问题,请参考以下文章
H - Maximal submatrix HDU - 6957