• 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;
    }
  • 相关阅读:
    Codeforces 1111D(退背包、排列组合)
    Codeforces 1152D(dp)
    UVaLive6443(线段树)
    UVaLive6435(dp)
    POJ1741(点分治)
    Codeforces 161D(树形dp)
    BZOJ2595(状压dp)
    关于spring java.lang.IllegalArgumentException: Name for argument type [java.lang.String] 的错误
    FingerPrint Fuzzy Vault Matlab实践
    Mybatis的ResultMap的使用
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5448117.html
Copyright © 2020-2023  润新知