Largest Submatrix

来源:互联网 发布:淘宝指数网 编辑:程序博客网 时间:2024/04/27 16:00


http://acm.hdu.edu.cn/showproblem.php?pid=2870

#include<stdio.h>
#include<string.h>
int a[1010][1010],b[1010][1010],c[1010][1010],l[1010],r[1010];
int main()
{
 int n,m,i,j,area;
 char ch;
 while(scanf("%d%d",&m,&n)!=EOF)
 {
  memset(a,0,sizeof(a));
  memset(b,0,sizeof(b));
  memset(c,0,sizeof(c));
  for(i=1;i<=m;i++)
  {
   getchar();
   for(j=1;j<=n;j++)
   {
    scanf("%c",&ch);
    if(ch=='a'||ch=='w'||ch=='y'||ch=='z')
     a[i][j]=a[i-1][j]+1;
    else
     a[i][j]=0;
    if(ch=='b'||ch=='w'||ch=='x'||ch=='z')
     b[i][j]=b[i-1][j]+1;
    else
     b[i][j]=0;
    if(ch=='c'||ch=='x'||ch=='y'||ch=='z')
     c[i][j]=c[i-1][j]+1;
    else
     c[i][j]=0;
   }
  }
  area=0;
  l[0]=1;
  r[n+1]=n;
  for(i=1;i<=m;i++)
  {
   a[i][0]=a[i][n+1]=-1;
   for(j=1;j<=n;j++)
   {
    l[j]=j;
    while(a[i][l[j]-1]>=a[i][j])
     l[j]=l[l[j]-1];
   }
   for(j=n;j>=1;j--)
   {
    r[j]=j;
    while(a[i][r[j]+1]>=a[i][j])
     r[j]=r[r[j]+1];
   }
   for(j=1;j<=n;j++)
    if(a[i][j]*(r[j]-l[j]+1)>area)
     area=a[i][j]*(r[j]-l[j]+1);

   b[i][0]=b[i][n+1]=-1;
   for(j=1;j<=n;j++)
   {
    l[j]=j;
    while(b[i][l[j]-1]>=b[i][j])
     l[j]=l[l[j]-1];
   }
   for(j=n;j>=1;j--)
   {
    r[j]=j;
    while(b[i][r[j]+1]>=b[i][j])
     r[j]=r[r[j]+1];
   }
   for(j=1;j<=n;j++)
    if(b[i][j]*(r[j]-l[j]+1)>area)
     area=b[i][j]*(r[j]-l[j]+1);

   c[i][0]=c[i][n+1]=-1;
   for(j=1;j<=n;j++)
   {
    l[j]=j;
    while(c[i][l[j]-1]>=c[i][j])
     l[j]=l[l[j]-1];
   }
   for(j=n;j>=1;j--)
   {
    r[j]=j;
    while(c[i][r[j]+1]>=c[i][j])
     r[j]=r[r[j]+1];
   }
   for(j=1;j<=n;j++)
    if(c[i][j]*(r[j]-l[j]+1)>area)
     area=c[i][j]*(r[j]-l[j]+1);
  }
  printf("%d\n",area);
 }
 return 0;
}

0 0
原创粉丝点击