[BZOJ3039] 玉蟾宫
题意
给定一个01矩阵,求最大面积的矩阵,矩阵中必须全是1。
题解
定义一个方格对应的矩阵为以它为底,最高的矩阵。
定义$l,r,h$分别为矩阵的左边界、右边界、高度。
那么矩阵面积$=(r-l+1)*h$
可以发现答案矩阵必定是某个点对应的矩阵
那么我们只要枚举每个点即可
对于0方格$i,j$
$l[i][j]=0,r[i][j]=m,h[i][j]=0$
对于1方格$i,j$
$l[i][j]=max(他左边最近的点+1,l[i-1][j])$
$r[i][j]=max(他右边最近的点-1,r[i-1][j])$
$h[i][j]=h[i-1][j]+1$
代码
#include <iostream>
#include <cstdio>
using namespace std;
#define N 1001
int l[N][N],r[N][N],h[N][N];
bool map[N][N];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
{
char ch;
scanf(" %c",&ch);
if(ch=='R') map[i][j]=1;
}
for(int i=1;i<=n;i++)
{
int last=0;//上一个障碍点
for(int j=1;j<=m;j++)//对l赋初值
{
if(map[i][j]) last=j,r[i][j]=m;
else l[i][j]=last+1,r[i][j]=m;
}
last=m+1;
for(int j=m;j;j--)//对r赋初值
{
if(map[i][j]) last=j;
else r[i][j]=last-1;
}
}
for(int i=1;i<=m;i++) r[0][i]=m+1;
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(map[i][j]) continue;
h[i][j]=h[i-1][j]+1;
l[i][j]=max(l[i][j],l[i-1][j]);
r[i][j]=min(r[i][j],r[i-1][j]);
ans=max(ans,(r[i][j]-l[i][j]+1)*h[i][j]);
}
}
cout<<ans*3;
}
看都看了,顺手点个推荐呗 :)

浙公网安备 33010602011771号