试题名称:黑白方块

时间限制:1.0 s 内存限制:512.0 MB

3.1.1 题面描述:小杨有一个nm列的网格图,其中每个格子要么是白色,要么是黑色。 对于网格图中的一个子矩形,小杨认为它是平衡的当且仅当其中黑色格子与白色格子数量相同。 小杨想知道最大的平衡子矩形包含了多少个格子。

3.1.2 输入格式:第一行包含两个正整数 n,m,含义如题面所示。

之后 n行,每行一个长度为m的01串,代表网格图第i行格子的颜色,如果为0,则对应格子为白色,否则为黑色。

3.1.3 输出格式:输出一个整数,代表最大的平衡子矩形包含格子的数量,如果不存在则输出0。 3.1.4 样例1

4 5

00000

01111

00011

00011

16 

3.1.5 样例解释 对于样例1,假设(i,j)代表第i行第j列,最大的平衡子矩形的四个顶点分别为 (1,2),(1,5),(4,2),(4,5)

3.1.6 数据范围 对于全部数据,保证有1\leq n,m\leq 10。 


#include<bits/stdc++.h>
using namespace std;
const int N = 55;
int w[N][N];
int n,m;
bool check(int xa,int ya,int xb,int yb){
	int a[2]={0,0};
	for(int i = xa;i<=xb;i++){
		for(int j=ya;j<=yb;j++){
			a[w[i][j]]++;
		}
	}
	return a[0]==a[1];
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		string s;
		cin>>s;
		for(int j=1;j<=m;j++){
			w[i][j]=s[j-1]-'0';
		}
	}
	int ans = 0;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			for(int ii=i;ii<=n;ii++){
			for(int jj=j;jj<=m;jj++){
				if(check(i,j,ii,jj)){
					ans = max(ans,(ii-i+1)*(jj-j+1));
				}
			}
		}
		}
	}
	cout<<ans<<"\n";
	return 0;
}

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐