【打CF,學演算法——二星級】Codeforces 22B Bargaining Table(區域和)
提交連結:CF 22B
題面:
B. Bargaining Table time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard outputBob wants to put a new bargaining table in his office. To do so he measured the office room thoroughly and drew its plan: Bob's office room is a rectangular roomn
The first line contains 2 space-separated numbers n andm (1 ≤ n, m ≤ 25) — the office room dimensions. Then there follown lines with m characters 0 or 1 each. 0 stands for a free square meter of the office room. 1 stands for an occupied square meter. It's guaranteed that at least one square meter in the room is free.
Output one number — the maximum possible perimeter of a bargaining table for Bob's office room.
Examples Input3 3 000 010 000Output
8Input
5 4 1100 0000 0000 0000 0000Output
16
題意:
0代表空閒位置,1代表佔有位置,給定一個01組成的區域,問空閒區域最大的周長為多少。
解題:
因為資料量特別小,可以採用區域和的形式,O(1)知道左上角點和右下角點之間1的個數(通過四塊區域和可以直觀地運算得出),列舉左上角點和右下角點即可。
程式碼:
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
using namespace std;
int mapp[30][30],sum[30][30];
int main()
{
int n,m,ans=0,tmp;
char s[30];
memset(sum,0,sizeof(sum));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s",s);
for(int j=1;j<=m;j++)
mapp[i][j]=s[j-1]-'0';
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+mapp[i][j];
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
for(int k=i+1;k<=n;k++)
{
for(int p=j+1;p<=m;p++)
{
tmp=sum[k][p]-sum[i][p]-sum[k][j]+sum[i][j];
if(tmp==0)
{
tmp=2*(k-i+p-j);
if(tmp>ans)
ans=tmp;
}
}
}
}
}
printf("%d\n",ans);
return 0;
}