zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    【原创】虚拟机上实现绑定固定IP扩主机容器互访
    docker entrypoint入口文件详解
    数据库博客推荐
    docker下centos安装ping命令
    Dockerfile指令详解
    Elasticsearch Java API 的使用
    docker容器里面安装ssh
    RPM安装命令总结
    Docker容器的跨主机连接
    使用Java程序片段动态生成表格
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5448117.html
Copyright © 2011-2022 走看看