题目链接:点击打开链接
题意:
给你一个M*N的区域。R代表被占用,F代表空闲。求最大矩形面积*3;
0 1 1 1 1 1 0 1 1 1 1 1
1 1 1 1 1 1 (F=1,R=0,方便求和) 1 2 2 2 2 2
0 0 0 1 1 1 转化完就是右边矩阵 0 0 0 3 3 3
1 1 1 1 1 1 1 1 1 4 4 4
1 1 1 1 1 1 2 2 2 5 5 5
右边就是所有情况。
所以先生成右边的矩阵,之后就和1506是一样的了。
1506自己写的,想偷懒,直接用模板的,结果外循环的t,和内循环的t定义的一个变量,检查了好久。。。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[1005][1005],l[1005],r[1005];
int n,m;
int main()
{
int t,i,j,Max,T;
char ch[4];
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&n,&m);
memset(a,0,sizeof(a));
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
scanf("%s",ch);
if(ch[0]=='F')a[i][j]=a[i-1][j]+1;
else a[i][j]=0;
}
Max=0;
for(int i=1; i<=n; i++)
{
l[1]=1;
r[m]=m;
for(j=2; j<=m; j++)
{
if(a[i][j]==0)
continue;
t=j;
while(t>1&&a[i][j]<=a[i][t-1])t=l[t-1];//t>1是考虑t==1的时候,直接跳出循环。找到左边高度比他高的边界
l[j]=t;
}
for(j=m-1; j>=1; j--)
{
if(a[i][j]==0)
continue;
t=j;
while(t<m&&a[i][j]<=a[i][t+1])t=r[t+1]; //t<n是考虑t==n的情况,直接跳出循环,找到左边高度比他高的边界
r[j]=t;
}
for(j=1; j<=m; j++)
Max=max(Max,(r[j]-l[j]+1)*a[i][j]);
}
printf("%d\n",Max*3);
}
return 0;
}