hdu1505/hdu1506最大子矩阵
#include <cstdio> #include <cstring> #include <iostream> using namespace std; /*ashione 2012-4-24 最大子矩阵变形,枚举a,b,c即可。 l,r的最大距离操作参照hdu1505. */ #define MAXN 1005 char str[MAXN][MAXN]; char fun[]={'a','b','c','w','x','y','z'}; int d[8][4]={{1,0,0},{0,1,0},{0,0,1},{1,1,0},{0,1,1},{1,0,1},{1,1,1}}; int num[2][4][MAXN],r[MAXN],l[MAXN]; int main(){ int n,m,i,j,k,t; while(~scanf("%d %d",&n,&m)){ for(i=1;i<=n;i++) scanf("%s",str[i]+1); int answer=0; memset(num,0,sizeof(num)); for(i=1;i<=n;i++){ int p=i&1; for(j=1;j<=m;j++){ for(k=0;k<7;k++){ if(str[i][j] == fun[k]){ for(t=0;t<3;t++){ if(d[k][t]) num[p][t][j]=num[!p][t][j]+1; else num[p][t][j]=0; } break; } } } for(k=0;k<3;k++){ for(t=1;t<=m;t++) l[t]= r[t]=t; for(j=1;j<=m;j++) { while(l[j]-1>=1 && num[p][k][l[j]-1]>=num[p][k][j]) l[j]=l[l[j]-1]; } for(j=m;j>=1;j--) { while(r[j]+1<=m && num[p][k][r[j]+1]>=num[p][k][j]) r[j]=r[r[j]+1]; } for(j=1;j<=m;j++) { int temp=num[p][k][j]*(r[j]-l[j]+1); if(answer<temp) answer=temp; } } } cout<<answer<<endl; } return 0; }