Acwing 152. 城市游戏(暴力枚举平面 单调栈)

这篇博客讨论了一道编程题目,它是AcWing131题目的升级版,涉及二维数组处理和求解每个平面上最大矩形面积的问题。通过遍历和栈操作找到每个位置的最大高度及对应的左右边界,进而计算出最大矩形面积。最终,博主给出了C++代码实现,并在主函数中遍历所有平面以找到全局的最大矩形面积。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题目就是模板题AcWing 131. 直方图中最大的矩形的一个升级版,就是要枚举每一个平面的最大值,然后套模板题的板子就可以了

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,m;
char s[N][N];
int a[N],ans=-1,l[N],r[N];
int get(int x){
    for(int i=1;i<=m;i++){
        int cnt=0,tep=x;
        while(tep>=1&&s[tep][i]=='F')cnt++,tep--;
        a[i]=cnt;
    }
    stack<int>s1,s2;
    a[0]=a[m+1]=-1;
    s1.push(0);
    for(int i=1;i<=m;i++){
        while(a[s1.top()]>=a[i])s1.pop();
        l[i]=s1.top();
        s1.push(i);
    }
    s2.push(m+1);
    for(int i=m;i>=1;i--){
        while(a[s2.top()]>=a[i])s2.pop();
        r[i]=s2.top();
        s2.push(i);
    }
    int maxx=-1;
    for(int i=1;i<=m;i++){
        maxx=max(maxx,a[i]*(r[i]-l[i]-1));
    }
    return maxx*3;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf(" %c",&s[i][j]);
        }
        
    }
    for(int i=1;i<=n;i++){
        //cout<<get(i)<<endl;
        ans=max(ans,get(i));
    }
    cout<<ans<<endl;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值