http://acm.hdu.edu.cn/showproblem.php?pid=1505
在一个区域建造矩形,问能建造的最大的矩形的面积是多少。是hdu1506的加强版,可进行参照。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int h[N][N],l[N][N],r[N][N];
char map[N][N];
int main(){
// freopen("in.txt", "r", stdin);
int cas;
scanf("%d",&cas);
while(cas--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1; i<=m; i++)
h[0][i] = 0;
for(int i=1; i<=n; i++){
for(int j=1; j<=m; j++){
scanf("%s",&map[i][j]);
l[i][j] = j - 1, r[i][j] = j + 1;
if(map[i][j] == 'F')
h[i][j] = h[i-1][j] + 1;
else if(map[i][j] == 'R')
h[i][j] = 0;
}
}
int ans = -1;
for(int i=1; i<=n; i++){
h[i][0] = h[i][m+1] = -1;
for(int j=1; j<=m; j++){
while(h[i][l[i][j]] >= h[i][j]){
l[i][j] = l[i][l[i][j]];
}
}
for(int j=m; j>=1; j--){
while(h[i][r[i][j]] >= h[i][j]){
r[i][j] = r[i][r[i][j]];
}
}
for(int j=1; j<=m; j++){
ans = max(ans, ((r[i][j] - 1) - (l[i][j]+1) + 1) * h[i][j]);
}
}
printf("%d\n",ans*3);
}
return 0;
}