先来个N^3的暴力(多么可爱QwQ)
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
char mp[1001][1005];
int n,m,up[1001][1005],Ans=0;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>mp[i][j];
for(int i=1;i<=m;i++)//列
for(int j=1;j<=n;j++)//行
if(mp[j][i]=='F') up[j][i]=up[j-1][i]+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(up[i][j])
{
int k=j,ans=up[i][j];
while(up[i][++k]>=up[i][j]) ans+=up[i][j];
k=j;
while(up[i][--k]>=up[i][j]) ans+=up[i][j];
Ans=max(Ans,ans);
}
printf("%d\n",Ans*3);
return 0;
}
N^2的单调栈求最大矩形面积
//单调栈
#include<cstdio>
#include<iostream>
#include<stack>
#include<cstring>
using namespace std;
struct alice
{
int l,h;
};
stack<alice>s;
char mp[1001][1005];
int n,m,up[1001][1005],Ans=0,len=0;
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>mp[i][j];
for(int i=1;i<=m;i++)//列
for(int j=1;j<=n;j++)//行
if(mp[j][i]=='F') up[j][i]=up[j-1][i]+1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
len=0;
while(!s.empty()&&up[i][j]<s.top().h)
{
len+=s.top().l;
Ans=max(Ans,len*s.top().h);
}
s.push((alice){len+1,up[i][j]});
}
len=0;
while(!s.empty())
{
len+=s.top().l;
Ans=max(Ans,len*s.top().h);
s.pop();
}
}
printf("%d\n",Ans*3);
return 0;
}