做完1506 再做1505 再做2870;
1505相当于做了多遍1506
2870则是做了3遍1505
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int height[1111][1111]; int r[1111][1111]; int l[1111][1111]; char map[1111][1111]; int m,n; int f() { int i,j,k,b; int ans=0; int sum; for(i=1; i<=m; i++) { for(j=2; j<=n; j++) { k=j; while(k>1&&height[i][j]<=height[i][k-1]) { k=l[i][k-1]; } l[i][j]=k; } for(j=n-1; j>=1; j--) { k=j; while(k<n&&height[i][j]<=height[i][k+1]) { k=r[i][k+1]; } r[i][j]=k; } sum=0; for(j=1; j<=n; j++) { b=height[i][j]*(r[i][j]-l[i][j]+1); if(sum<b) sum=b; if(sum>ans) ans=sum; } return ans; } int main() { int i,j,k,b; while(cin>>m>>n) { getchar(); memset(height,0,sizeof(height)); int ans=0; int sum; for(i=1; i<=m; i++) { for(j=1; j<=n; j++) { scanf("%c",&map[i][j]); } getchar(); } int a1,a2,a3; for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { if(map[i][j]=='a'||map[i][j]=='y'||map[i][j]=='z'||map[i][j]=='w') height[i][j]=height[i-1][j]+1; else height[i][j]=0; r[i][j]=l[i][j]=j; } } a1=f(); memset(height,0,sizeof(height)); for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { if(map[i][j]=='b'||map[i][j]=='x'||map[i][j]=='z'||map[i][j]=='w') height[i][j]=height[i-1][j]+1; else height[i][j]=0; r[i][j]=l[i][j]=j; } } a2=f(); memset(height,0,sizeof(height)); for(i=1;i<=m;i++) { for(j=1;j<=n;j++) { if(map[i][j]=='c'||map[i][j]=='y'||map[i][j]=='z'||map[i][j]=='x') height[i][j]=height[i-1][j]+1; else height[i][j]=0; r[i][j]=l[i][j]=j; } } a3=f(); a1=max(a1,a2); a3=max(a1,a3); cout<<a3<<endl; } return 0; }