题意:求最大的子矩阵,要求矩阵的字母都是一样的
思路:首先枚举所有的可能,也就是a,b,c,,然后就是类似于HDU1505,1506两道题目了
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1010;
char map[MAXN][MAXN];
int n,m;
int num[MAXN],l[MAXN],r[MAXN];
int f(char a,char b){
if (b == 'a' && (a == 'w' || a == 'y' || a == 'a' || a == 'z'))
return 1;
if (b == 'b' && (a == 'w' || a == 'x' || a == 'b' || a == 'z'))
return 1;
if (b == 'c' && (a == 'x' || a == 'y' || a == 'c' || a == 'z'))
return 1;
return 0;
}
int main(){
while (scanf("%d%d",&n,&m) != EOF){
memset(num,0,sizeof(num));
memset(l,0,sizeof(l));
memset(r,0,sizeof(r));
for (int i = 1; i <= n; i++)
scanf("%s",map[i]+1);
int ans = 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 (f(map[i][j],a))
num[j]++;
else num[j] = 0;
}
for (int j = 1; j <= m; j++){
if (num[j] == 0)
continue;
while (l[j] > 1 && num[l[j]-1] >= num[j])
l[j] = l[l[j]-1];
while (r[j] < m && num[r[j]+1] >= num[j])
r[j] = r[r[j]+1];
ans = max(ans,num[j]*(r[j]-l[j]+1));
}
}
printf("%d\n",ans);
}
return 0;
}