[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; }
看都看了,顺手点个推荐呗 :)