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
",ans);
    }
    return 0;
}