题目:
题意:
给出一张 n ∗ m n*m n∗m的图,有两种点,问由其中一种点构成的矩形的最大面积是多少
分析:
因为题目中
n
、
m
n、m
n、m都是可以达到
1000
1000
1000的,所以就要求我们在
O
(
1
)
O(1)
O(1)得到包含当前这个点的最大矩形的面积是多少
我们可以先预处理出仅对于一行当前点可以拓展到的最大矩形的长度是多少
然后在求最大矩形的时候,我们就与上一行的点作比较,修正长度,然后再顺便累加宽度
在所有答案中取
m
a
x
max
max就好了
代码:
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
#include<vector>
#define LL long long
using namespace std;
inline LL read() {
LL d=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
return d*f;
}
inline int rr() {
char s=getchar();
while(s!='F'&&s!='R') s=getchar();
return (s=='R'?1:0);
}
int t[1005][1005],l[1005][1005],r[1005][1005],u[1005][1005];
int main()
{
int n=read(),m=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
t[i][j]=rr(),l[i][j]=r[i][j]=j,u[i][j]=1;
for(int i=1;i<=n;i++)
for(int j=2;j<=m;j++)
if(!t[i][j]&&!t[i][j-1]) l[i][j]=l[i][j-1];
for(int i=1;i<=n;i++)
for(int j=m-1;j;j--)
if(!t[i][j]&&!t[i][j+1]) r[i][j]=r[i][j+1];
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(i>1&&!t[i][j]&&!t[i-1][j]) l[i][j]=max(l[i][j],l[i-1][j]),r[i][j]=min(r[i][j],r[i-1][j]),u[i][j]=u[i-1][j]+1;
ans=max(ans,(r[i][j]-l[i][j]+1)*u[i][j]);
}
}
cout<<ans*3;
return 0;
}