HDU 2870 Largest Submatrix
POJ 3494 升级版,算三遍就可以了。
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int maxn=1000+10; int a[maxn]; int L[maxn],R[maxn]; int m,n; int tmp[maxn][maxn],b[maxn][maxn]; char s[maxn][maxn]; void f() { for(int i=1; i<=n; i++) L[i]=i; for(int i=2; i<=n; i++) { if(a[i]>a[i-1]) continue; int pre=L[i-1]; while(1) { L[i]=pre; if(pre==1||a[pre-1]<a[i]) break; pre=L[pre-1]; } } for(int i=n; i>=1; i--) R[i]=i; for(int i=n-1; i>=1; i--) { if(a[i]>a[i+1]) continue; int pre=R[i+1]; while(1) { R[i]=pre; if(pre==n||a[pre+1]<a[i]) break; pre=R[pre+1]; } } } int main() { while(~scanf("%d%d",&n,&m)) { int ans=0; for(int i=0; i<n; i++) scanf("%s",s[i]); for(int k=1; k<=3; k++) { if(k==1) { for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(s[i][j]=='w'||s[i][j]=='y'||s[i][j]=='z'||s[i][j]=='a') tmp[i+1][j+1]=1; else tmp[i+1][j+1]=0; } } else if(k==2) { for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(s[i][j]=='w'||s[i][j]=='x'||s[i][j]=='z'||s[i][j]=='b') tmp[i+1][j+1]=1; else tmp[i+1][j+1]=0; } } else if(k==3) { for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(s[i][j]=='x'||s[i][j]=='y'||s[i][j]=='z'||s[i][j]=='c') tmp[i+1][j+1]=1; else tmp[i+1][j+1]=0; } } memset(b,0,sizeof b); for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) { if(tmp[i][j]==0) continue; b[i][j]=b[i][j-1]+tmp[i][j]; } for(int j=1; j<=m; j++) { for(int i=1; i<=n; i++) a[i]=b[i][j]; f(); for(int i=1; i<=n; i++) ans=max(ans,a[i]*(R[i]-L[i]+1)); } } printf("%d\n",ans); } return 0; }