预处理出每个点向上扩展的高度,对于每一行维护单调递增的栈,在弹出元素的时候统计答案。
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int mp[1005][1005];
char c[2];
int h[1005][1005];
stack<int> S;
int main()
{
// freopen("jademoon.in","r",stdin);
// freopen("jademoon.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%s",c);
if(c[0]=='R')mp[i][j]=1;
else mp[i][j]=2;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(mp[i][j]==2)
h[i][j]=h[i-1][j]+1;
else h[i][j]=0;
}
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
ans=max(ans,h[i][j]);
int v=j;
while(!S.empty()&&h[i][j]<h[i][S.top()])
{
v=S.top();S.pop();
ans=max(ans,(j-v)*h[i][v]);
h[i][v]=h[i][j];
}
S.push(v);
}
while(!S.empty())
{
int v=S.top();S.pop();
ans=max(ans,(m-v+1)*h[i][v]);
}
}
printf("%d",ans*3);
return 0;
}