题目来源:

https://www.luogu.com.cn/problem/B4005

题目背景

对应的选择、判断题:试题 - GESP 202406 C++ 四级 - 洛谷有题

题目描述

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

输入格式

第一行包含两个正整数 n,m,含义如题面所示。

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

输出格式

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

输入输出样例

输入 #1

4 5
00000
01111
00011
00011

输出 #1

16

说明/提示

【样例解释】

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

【数据范围】

对于全部数据,保证有 1≤n,m≤10。

这是一道枚举暴力题目(也可以用前缀和解决【别问我为什么不用前缀和】),主要思路就是去枚举矩形的四个顶点(需要注意下标的问题,有问题可以到评论里问,我会一一回答【看着就回】),在进行题目中累加,比较等操作。

看dai马:

题目代码:
 

#include<bits/stdc++.h>
using namespace std;
char a[15][15];
int ans=0;
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	} 
    for(int i=1;i<=n;i++){
    	for(int j=i;j<=n;j++){
    		for(int ii=1;ii<=m;ii++){
    			for(int jj=ii;jj<=m;jj++){
    				int b=0;
    				int h=0;
    				for(int x=i;x<=j;x++){
    					for(int y=ii;y<=jj;y++){
    						if(a[x][y]=='0') h++;
    						else b++;
						}
					}
					if(h==b){
						ans=max(ans,2*h);
					}
				}
			}
		}
	}
	cout<<ans;
return 0;
}

你学会了.......你肯定学会了。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐