餐桌
Description
你家剛買了一套新房,想邀請朋友回來慶祝,所以需要一個(gè)很大的舉行餐桌,餐桌能容納的人數(shù)等于餐桌的周長,你想買一個(gè)能容納最多人的餐桌,餐桌的邊必須跟房間的邊平行。
給你的房間的設(shè)計(jì),計(jì)算最多能邀請的客人數(shù)。
Input
第一行包含兩個(gè)整數(shù)R和C(1<=R,C<=2000),表示房子的長和寬。
接下來R行每行S個(gè)字符(中間沒有空格),“.”表示空白區(qū)域,“X”表示有障礙物,餐桌所占區(qū)域必須是空白的。
Output
輸出最多能要求的客人數(shù)量。
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
【數(shù)據(jù)規(guī)模】
50%的數(shù)據(jù)R,C<=400
70%的數(shù)據(jù)R,C<=1000
100%的數(shù)據(jù),R,C<=2000
.
.
.
.
.
.
.
分析
搞一個(gè)前綴和然后暴力枚舉開始點(diǎn),然后取最大值
.
.
.
.
.
程序:
#include<iostream> using namespace std; int a[2001][2001],f[2001],ans,n,m,t; char ch; int main() {cin>>n>>m;for (int i=1;i<=n;i++)for (int j=1;j<=m;j++){cin>>ch;if (ch=='X') a[i][j]=-1;}for (int i=1;i<=m;i++)if (a[m][i]!=-1) a[m][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;}int min,x;for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)if (a[i][j]>0){x=j;min=2147483647;while (a[i][x]>0){if (a[i][x]<min) min=a[i][x];if ((x-j+1+min)*2-1>ans) ans=(x-j+1+min)*2-1;x++;}}cout<<ans;return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/YYC-0304/p/9499948.html
總結(jié)