土豪聪要请客

众所周知,聪哥(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

对于60%的数据,n,m<=100

对于100%的数据,n,m<=400

 两种写法

#include<cstdio>
#include<iostream>
#define N 410
using namespace std;
char map[N][N];int s[N][N],n,m;
int main(){
    //freopen("jh.in","r",stdin);
    freopen("stol.in","r",stdin);
    freopen("stol.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%s",map[i]);
        for(int j=0;j<m;j++){
            if(map[i][j]=='.')s[i][j+1]=1;
            else s[i][j+1]=0;
            s[i][j+1]+=s[i][j];
        }
    }
    int ans=0;
    for(int i=1;i<=m;i++){
        for(int j=i;j<=m;j++){
            int maxp=0,p=0;
            for(int k=1;k<=n;k++){
                if(s[k][j]-s[k][i-1]==j-i+1)p++;
                else maxp=max(maxp,p),p=0;
            }
            maxp=max(maxp,p);
            if(maxp)ans=max(ans,2*(j-i+1)+maxp*2);
        }
    }
    printf("%d",ans-1);
    fclose(stdin);fclose(stdout);
    return 0;
}
#include<iostream>
#include<cstdio>
#define N 410
using namespace std;
char map[N][N];int n,m,h[N][N],l[N][N],r[N][N];
int main(){
    //freopen("jh.in","r",stdin);
    freopen("stol.in","r",stdin);
    freopen("stol.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>map[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(map[i][j]=='.')h[i][j]=h[i-1][j]+1;
            else h[i][j]=0;
    int ans=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            for(int k=j-1;k>=1;k--)
                if(h[i][k]>=h[i][j])l[i][j]++;
                else break;
            for(int k=j+1;k<=m;k++)
                if(h[i][k]>=h[i][j])r[i][j]++;
                else break;
        }
    for(int i=1;i<=n;i++)
          for(int j=1;j<=m;j++){
              if(!h[i][j])continue;
              ans=max(ans,(h[i][j]+l[i][j]+r[i][j]+1)*2);
        }
    printf("%d",ans-1);
    return 0;
}
原文地址:https://www.cnblogs.com/harden/p/6075664.html