题意:
求最大子矩阵,求其面积*3
思路:
暴力枚举,每行都统计一次最大面积,由于某个点经过了左右的扫描,所以面积为 (righ[i][j]-lef[i][j]+1)*up[i][j]
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1000+10;
int n, m;
int mat[maxn][maxn], lef[maxn][maxn], righ[maxn][maxn], up[maxn][maxn];
int main() {
int kase;
scanf("%d", &kase);
while(kase--) {
scanf("%d%d", &m, &n);
for(int i=0; i<m; i++)
for(int j=0; j<n; j++) {
char a = getchar();
while(a != 'F' && a != 'R') a = getchar();
mat[i][j] = a == 'F'?0:1;
}
int l=0, r=n, ans=0;
for(int i=0; i<m; i++) {
l=-1; r=n;
for(int j=0; j<n; j++) {
if(mat[i][j]==1) {
up[i][j]=0;
lef[i][j]=0;
l=j;//记录最近一次碰到障碍的地方,即在未碰到障碍是是不会变动的
}
else {
up[i][j] = (i==0)?1:up[i-1][j]+1;
lef[i][j] = (i==0)?l+1:max(lef[i-1][j], l+1);
}
}
for(int j=n-1; j>=0; j--) {
if(mat[i][j]==1) {
righ[i][j]=n;
r=j;
}
else {
righ[i][j] = (i==0)?r-1:min(righ[i-1][j], r-1);
ans = max(ans, (righ[i][j]-lef[i][j]+1)*up[i][j]);
}
}
}
printf("%d\n", ans*3);
}
return 0;
}