前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Acwing 152. 城市游戏(暴力枚举平面 单调栈)

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

作者头像
glm233
发布2021-05-14 10:22:13
2450
发布2021-05-14 10:22:13
举报

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

代码语言:javascript
复制
#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;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-05-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档