二维图中找最大子矩阵的方法
https://ac.nowcoder.com/acm/problem/50965
这是一道在直方图中寻找最大子矩形的题目,我们可以通过将单个矩形左右延伸来计算最大值
需要注意的是,这里的数据范围是1e9,所以我们要用long long定义相关变量,否则范围不够
由于数据较多并且大,推荐使用scanf来读取
#include <bits/stdc++.h>
using namespace std;
const int m=1e5+5;
struct node{
int left,right;//左右边界
long long height;//高度
}h[m];
long long ma=-1;
int main(){
int n;
while(scanf("%d",&n)&&n){
ma=-1e9;
for(int i=1;i<=n;i++){
scanf("%lld",&h[i].height);
h[i].left=h[i].right=i;//初始化的左右范围都是自己
}
h[0].height=-1e9;//为了让边界比较
h[n+1].height=-1e9;
for(int i=1;i<=n;i++){
while(h[i].height<=h[h[i].left-1].height) h[i].left=h[h[i].left-1].left;//更新每个矩形左边边界的值
}
for(int i=n;i>=1;i--){
while(h[i].height<=h[h[i].right+1].height) h[i].right=h[h[i].right+1].right;//更新每个矩形右边边界的值
}
for(int i=1;i<=n;i++){//计算最大值
long long tmp=(h[i].right-h[i].left+1)*h[i].height;
if(tmp>ma) ma=tmp;
}
printf("%lld\n",ma);
}
return 0;
}