题目:
题目描述
众所周知,聪哥(ndsf)是个土豪,不过你们不知道的是他的MZ和他的RMB一样滴多…… 某天土豪聪又赚了10^10000e的RMB,他比较开心,于是准备请客。他在自己在XX星上的别墅里面大摆酒席,想要邀请尽可能多的MZ来参加他的宴会。他将会同MZ一起坐在一个巨大的长方形桌子上。这个桌子能坐下的人数等于他的边长。聪哥要求他的桌子能够放进他的别墅,并且桌子的边必须与别墅的边界平行。给定别墅的平面图,请你求出聪哥最多可以请多少个MZ。
输入输出格式
输入格式:
第一行n,m。表示别墅的长宽 下面n行,每行M个字符,表示一个方块是空的(‘ ’)或是被占用了(‘X’)。 聪哥只要他的桌子放在别墅里,并且桌子不能占用任何一个已经占用了的方块。
输出格式:
一个数,表示聪哥最多可以请几个Maze。
输入输出样例
输入样例#1:
2 2
..
..
输出样例#1:
7
输入样例#2:
4 4
X.XX
X..X
..X.
..XX
输出样例#2:
9
说明
对于100%的数据,n,m<=400
思路:枚举行数,扫描线。
代码:
#include<bits/stdc++.h>
using namespace std;
#define read(x) scanf("%d",&x)
#define maxn 400
int n,m;
char a[maxn+5][maxn+5];
int sum[maxn+5][maxn+5];
int main() {
read(n),read(m);
for(int i=1;i<=n;i++) scanf("%s",a[i]+1);
for(int j=1;j<=m;j++) {
for(int i=1;i<=n;i++) {
sum[i][j]=sum[i-1][j]+(a[i][j]=='X');
}
}
int ans=0;
for(int i=1;i<=n;i++) {
for(int j=i;j<=n;j++) {
int d=0;
for(int k=1;k<=m;k++) {
if(sum[j][k]-sum[i-1][k]) d=k;
else ans=max(ans,(j-i+1+k-d)*2);
}
}
}
printf("%d",ans-1);
return 0;
}