餐桌

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值