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

  

posted @ 2019-11-08 19:24  linzhuohang  阅读(189)  评论(0编辑  收藏  举报