题目链接:Click here~~
题意:
和HDU 2830类似,只是这次不能再将列任意移动,于是题目完全变成了求最大长方形那道题。
解题思路:
只说如何求最大长方形,我的思路是枚举每个高度,然后以它做基准,向左向右扩张,扩张条件是h[i-k]>=h[k]、h[i+k]>=h[k]。记录扩张的个数即可。
没想到这题竟然进rank了,好高兴。话说我都没用传说中的单调队列呢。
#include <stdio.h>
#include <string.h>
#define N 1002
#define min(a,b) a < b ? a : b
bool Check(char std,char c)
{
if(std == 'a')
return c=='a' || c=='w' || c=='y' || c=='z';
if(std == 'b')
return c=='b' || c=='w' || c=='x' || c=='z';
if(std == 'c')
return c=='c' || c=='x' || c=='y' || c=='z';
}
int main()
{
int R,C,num[N];
char w[N][N];
while(~scanf("%d%d",&R,&C))
{
int ans = 0;
for(int i=0;i<R;i++)
scanf("%s",w[i]);
for(char c='a';c<='c';c++)
{
memset(num,0,sizeof(num));
for(int i=0;i<R;i++)
{
for(int j=0;j<C;j++)
{
if(Check(c,w[i][j]))
++num[j];
else
num[j] = 0;
}
for(int j=0;j<C;j++)
{
if(!num[j])
continue;
int cnt = 1;
for(int k=1;j-k>0 && num[j-k]>=num[j];k++)
++cnt;
for(int k=1;j+k<C && num[j+k]>=num[j];k++)
++cnt;
if(num[j]*cnt > ans)
ans = num[j]*cnt;
}
}
}
printf("%d\n",ans);
}
return 0;
}