hdu 2870 Largest Submatrix

来源:互联网 发布:linux java安装 编辑:程序博客网 时间:2024/04/27 14:05

题意略。

是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;}


0 0
原创粉丝点击