hdu 2870 Largest Submatrix

题意略。

是hdu 1505 的变形,先将所有能变的都变,得到一个没有w、x、y、z的矩阵。

然后就是重复1505的做法了,求三次,取最大值。


#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

char mp[1005][1005];
char w[1005][1005];
int t[1005][1005];
int le[1005],ri[1005];
int m,n,ans,tmp;

void solve(char key,char a,char b,char c)
{
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(mp[i][j]==a || mp[i][j]==b || mp[i][j]==c)
                w[i][j]=key;
            else w[i][j]=mp[i][j];
        }
    }
    memset(t,0,sizeof(t));
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(w[i][j]==key)
                t[i][j]=t[i-1][j]+1;
            else t[i][j]=0;
        }
    }
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
            le[j]=ri[j]=j;
        for(int j=2;j<=n;j++)
        {
            while(le[j]>1 && t[i][j]<=t[i][le[j]-1])
                le[j]=le[le[j]-1];
        }
        for(int j=n-1;j>=1;j--)
        {
            while(ri[j]<n && t[i][j]<=t[i][ri[j]+1])
                ri[j]=ri[ri[j]+1];
        }
        for(int j=1;j<=n;j++)
        {
            tmp=t[i][j]*(ri[j]-le[j]+1);
            if(tmp>ans)
                ans=tmp;
        }
    }
}

int main()
{
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        memset(mp,0,sizeof(mp));
        ans=-1;
        for(int i=1;i<=m;i++)
            scanf("%s",mp[i]+1);
        solve(‘a‘,‘w‘,‘y‘,‘z‘);
        solve(‘b‘,‘w‘,‘x‘,‘z‘);
        solve(‘c‘,‘x‘,‘y‘,‘z‘);
        printf("%d\n",ans);
    }
    return 0;
}


hdu 2870 Largest Submatrix

上一篇:Shellcode的原理及编写


下一篇:七天速成小程序--喜马拉雅