思路是把每一行以上矩阵转化为 刷广告/贴海报 问题,有l[i],r[i],代表第j列能向右向左的最大距离。
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int x=0,f=1;
char c=getchar();
while(c>57||c<48){
if(c==45)f=-1;
c=getchar(); }
while(c<=57&&c>=48){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x*f;
}
const int N=1e3+10;
char o[N][N]; int n,m,f[N][N],ans,l[N],r[N],t,s[N];
void sta(int x){
t=0;
for(int i=1;i<=m;i++){
while(t&&f[x][s[t]]>=f[x][i])t--;//一直删到比他小
l[i]=s[t]+1;//左边界
s[++t]=i;
}
t=0;s[0]=m+1;
for(int i=m;i>=1;i--){
while(t&&f[x][s[t]]>=f[x][i])t--;//一直删到比他小
r[i]=s[t]-1;//右边界
s[++t]=i ;
}
for(int i=1;i<=m;i++){
ans=max(ans,(r[i]-l[i]+1)f[x][i]); } }
signed main(){
n=read();m=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>o[i][j];
if(o[i][j]=='F')f[i][j]=f[i-1][j]+1;
//相当于第j列包含o[i][j]的 最多有几个连续的F
else f[i][j]=0;//当然若是R则是0
}
for(int i=1;i<=n;i++){//变成每一列的刷广告牌问题
sta(i);
}
printf("%lld",ans3);
}