这个题还是矩阵问题。做过一个这样的了。 还是找一个完全子矩阵,使得包含的相同元素最多。
还是 l【】 r【】 这样递推。。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <fstream>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <list>
#include <vector>
#include <cmath>
#include <iomanip>
#include <cmath>
typedef long long LL;
typedef unsigned long long LLU;
const double PI=acos(-1.0);
using namespace std;
#define MAXN 1000+10
#define INF 1 << 30
char s[MAXN][MAXN],map_[MAXN][MAXN];
int m,n;int d[MAXN][MAXN] = {0};
int dp(char c, char x, char y, char z){
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(s[i][j] == c || s[i][j] == x || s[i][j] == y || s[i][j] == z)
map_[i][j] = c;
else
map_[i][j] = s[i][j];
}
}
memset(d,0,sizeof(d));
int ans = 0;
for(int i = 1; i <= m; i++){
d[i][0] = d[i][n+1] = -1;
for(int j = 1; j <= n; j++){
if(map_[i][j] == c)
d[i][j] = d[i-1][j]+1;
else
d[i][j] = 0;
}
}
for(int i = 1; i <= m; i++){
int l[MAXN] = {0},r[MAXN] = {0};
for(int j = 1; j <= n; j++)
l[j] = j, r[j] = j;
for(int j = 2; j <= n; j++){
if(d[i][j])
while(d[i][l[j]-1] >= d[i][j])
l[j] = l[l[j]-1];
}
for(int j = n-1; j >= 1; j--){
if(d[i][j])
while(d[i][r[j]+1] >= d[i][j])
r[j] = r[r[j]+1];
}
for(int j = 1; j <= n; j++){
ans = max(ans, (r[j]-l[j]+1)*d[i][j]);
}
}
return ans;
}
int main (){
while(scanf("%d%d",&m,&n) != EOF){
for(int i = 1; i <= m; i++){
scanf("%s",s[i]+1);
}
int ans = 0;
ans = max(ans, dp('a','w','y','z'));
ans = max(ans, dp('b','w','x','z'));
ans = max(ans, dp('c','x','y','z'));
printf("%d\n",ans);
}
return 0;
}