题目描述
你家刚买了一套新房,想邀请朋友回来庆祝,所以需要一个很大的举行餐桌,餐桌能容纳的人数等于餐桌的周长,你想买一个能容纳最多人的餐桌,餐桌的边必须跟房间的边平行。
给你的房间的设计,计算最多能邀请的客人数。(客人数=总人数-1)
题目解析
先预处理出每个空地向上有多少个空地。
直接枚举每个空地,判断右边是否为空地,更新宽度和最低高度,并求周长,取个MaxMaxMax值即可。
代码
#include<bits/stdc++.h>
using namespace std;
int r,c,ans;
int up[2005][2005];
char a[2005][2005];
int main()
{
cin>>r>>c;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
{
cin>>a[i][j];
if(a[i][j]=='.')
up[i][j]=up[i-1][j]+1;
}
for(int i=1;i<=r;i++)
for(int j=1,wide,high;j<=c;j++)
if(a[i][j]=='.')
{
wide=0;high=1e9;
for(int k=0;k<=c-j;k++)
if(a[i][j+k]=='.')
{
wide++,high=min(high,up[i][j+k]);
ans=max(ans,2*(high+wide));
}
else
break;
}
cout<<ans-1;
}