本文主要是介绍餐桌,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Description
你家刚买了一套新房,想邀请朋友回来庆祝,所以需要一个很大的举行餐桌,餐桌能容纳的人数等于餐桌的周长,你想买一个能容纳最多人的餐桌,餐桌的边必须跟房间的边平行。
给你的房间的设计,计算最多能邀请的客人数。
Input
第一行包含两个整数R和C(1<=R,C<=2000),表示房子的长和宽。
接下来R行每行S个字符(中间没有空格),“.”表示空白区域,“X”表示有障碍物,餐桌所占区域必须是空白的。
Output
输出最多能要求的客人数量。
Sample Input
输入1:
2 2
…
…
输入2:
4 4
X.XX
X…X
…X.
…XX
输入3:
3 3
X.X
.X.
X.X
Sample Output
输出1:
7
输出2:
9
输出3:
3
Data Constraint
Hint
【数据规模】
50%的数据R,C<=400
70%的数据R,C<=1000
100%的数据,R,C<=2000
.
.
.
.
.
分析
总感觉数据过水了
我们从下到上做每一列的前缀和
暴枚每个点,向右扩展求周长即可
.
.
.
.
.
.
程序:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;int a[2001][2001],f[2001],ans,n,m,t;int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)for (int j=1;j<=m;j++){char ch;cin>>ch;if (ch=='X') a[i][j]=-1;}for (int i=1;i<=m;i++)if (a[n][i]!=-1) a[n][i]=1;for (int i=n-1;i>=1;i--)for (int k=1;k<=m;k++){if (a[i][k]!=-1)if (a[i+1][k]==-1) a[i][k]=1; else a[i][k]=a[i+1][k]+1;}for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)if (a[i][j]>0){int x=j,minn=2147483647;while (a[i][x]>=1){minn=min(minn,a[i][x]);if ((x-j+1+minn)*2-1>ans) ans=(x-j+1+minn)*2-1;x++;}}printf("%d",ans);return 0;
}
这篇关于餐桌的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!