#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1002;
int n,m,t,ans,cas=1;
int h[maxn][maxn];///h[i,j]为点(i,j)对应的悬线的长度。
int l[maxn];///l[i,j]为点(i,j)对应的悬线向左最多能够移动到的位置。
int r[maxn];///r[i,j]为点(i,j)对应的悬线向右最多能够移动到的位置。
char str[maxn][maxn];///图像
void DP()
{
int i,j;
for(i=1;i<=n;i++)
{
h[i][0]=h[i][m+1]=-1;
for(j=1;j<=m;j++)l[j]=r[j]=j;
for(j=2;j<=m;j++)
{
while(h[i][l[j]-1]>=h[i][j])l[j]=l[l[j]-1];
}
for(j=m-1;j>=1;j--)
{
while(h[i][r[j]+1]>=h[i][j])r[j]=r[r[j]+1];
}
for(j=1;j<=m;j++)
{
if (h[i][j]*(r[j]-l[j]+1)>ans) ans=h[i][j]*(r[j]-l[j]+1);
}
}
}
int main()
{
//freopen("//media/学习/ACM/input.txt","r",stdin);
memset(h[0],0,sizeof(h[0]));
while(scanf("%d%d",&n,&m)!=EOF)
{
int i,j;
ans=0;
for( i=1;i<=n;++i)
scanf("%s",str[i]+1);
for( i=1;i<=n;++i)
for( j=1;j<=m;++j)
if(str[i][j]=='a'||str[i][j]=='w'||str[i][j]=='y'||str[i][j]=='z')
h[i][j]=h[i-1][j]+1;
else
h[i][j]=0;
DP();
for( i=1;i<=n;++i)
for( j=1;j<=m;++j)
if(str[i][j]=='b'||str[i][j]=='w'||str[i][j]=='x'||str[i][j]=='z')
h[i][j]=h[i-1][j]+1;
else
h[i][j]=0;
DP();
for( i=1;i<=n;++i)
for( j=1;j<=m;++j)
if(str[i][j]=='c'||str[i][j]=='x'||str[i][j]=='y'||str[i][j]=='z')
h[i][j]=h[i-1][j]+1;
else
h[i][j]=0;
DP();
printf("%d\n",ans);
}
return 0;
}
hdu 2870 最大子矩阵 单调队列优化+dp
最新推荐文章于 2020-03-23 20:45:15 发布