http://acm.hdu.edu.cn/showproblem.php?pid=2870
和1506 和1505类似的解法
一个关键的优化就是
if(!num[j])
continue;
说实话不是想不到,关键是懒的加,因为看起来不可能优化多少
现在知道了,以后能优化的尽量优化,
这个不加就是超时与不超时的关系
代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#define max(a,b) a>b?a:b
using namespace std;
char matrix[1010][1010];
int check(char a,char ans)
{
if(ans=='a'&&(a=='w'||a=='y'||a=='a'||a=='z'))
return 1;
if(ans=='b'&&(a=='w'||a=='x'||a=='b'||a=='z'))
return 1;
if(ans=='c'&&(a=='x'||a=='y'||a=='c'||a=='z'))
return 1;
return 0;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
int num[1010]={0};
int l[1010]={0};
int r[1010]={0};
for(int i=1;i<=n;i++)
scanf("%s",matrix[i]+1);
int maxn=0;
for(char a='a';a<='c';a++)
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
l[j]=r[j]=j;
}
for(int j=1;j<=m;j++)
{
if(check(matrix[i][j],a))
num[j]++;
else
num[j]=0;
}
for(int j=1;j<=m;j++)
{
if(!num[j])
continue;
while(l[j]-1>0&&num[l[j]-1]>=num[j])
l[j]=l[l[j]-1];
while(r[j]+1<=m&&num[r[j]+1]>=num[j])
r[j]=r[r[j]+1];
maxn=max((r[j]-l[j]+1)*num[j],maxn);
}
}
printf("%d\n",maxn);
}
}