大概类似悬线法(但其实我不知道悬线法是啥qwq可能是根悬着的线来扫描吧)
模拟这种方法,枚举极大子矩形,奇怪的是居然WA两个点 甚至TLE#11 不应该呀??最坏的情况就是F R F R...都不会TLE,那#11是啥玩意啊...... (测评记录)
代码如下,有点长,但其实大多是重复的函数,可读性还是比较高(我觉得吧qwq)的
#include <bits/stdc++.h>
using namespace std;
const int N=1005;
struct node{
int x,y,c;
}que[N*N];
int n,m,a[N][N],rct,maxs;
int search_left(int hx,int ex,int y)
{
if(y==1) return ex-hx+1;
int ey=1;
for(int i=y; i>=1; i--)
{
int flag=0;
for(int j=hx; j<=ex; j++)
if(a[j][i]==2)
{
flag=1;
break;
}
if(flag)
{
ey=i+1;
break;
}
}
return (ex-hx+1)*(y-ey+1);
}
int search_right(int hx,int ex,int y)
{
if(y==m) return ex-hx+1;
int ey=m;
for(int i=y; i<=m; i++)
{
int flag=0;
for(int j=hx; j<=ex; j++)
if(a[j][i]==2)
{
flag=1;
break;
}
if(flag)
{
ey=i-1;
break;
}
}
return (ex-hx+1)*(ey-y+1);
}
void search_up(int x,int y)
{
int ex=x-1,hx=1;
for(int i=ex; i>=1; i--)
if(a[i][y]==2)
{
hx=i+1;
break;
}
maxs=max(maxs,search_left(hx,ex,y)+search_right(hx,ex,y)-(ex-hx+1));
}
void search_down(int x,int y)
{
int hx=x+1,ex=n;
for(int i=hx; i<=n; i++)
if(a[i][y]==2)
{
ex=i-1;
break;
}
maxs=max(maxs,search_left(hx,ex,y)+search_right(hx,ex,y)-(ex-hx+1));
}
int main()
{
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
char c;
scanf(" %c",&c);
if(c=='R')
{
a[i][j]=2;
rct++;
que[rct].x=i;
que[rct].y=j;
}
else a[i][j]=1;
}
search_down(0,1);
search_down(0,m);
search_up(n+1,1);
search_up(n+1,m);
for(int i=1; i<=rct; i++)
{
if(que[i].c==1) continue;
int x=que[i].x;
int y=que[i].y;
if(x>1) search_up(x,y);
if(x<n) search_down(x,y);
}
cout<<maxs*3;
return 0;
}