站外题求调悬关
  • 板块学术版
  • 楼主_Anonymous_
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/3/11 21:50
  • 上次更新2023/10/23 21:50:51
查看原帖
站外题求调悬关
381926
_Anonymous_楼主2023/3/11 21:50

题干:

给出一个 nmn*m 的仅包含 0101 的矩阵,求该矩阵中仅包含 00 的最大矩阵

样例输入1:

3 2

10

11

11

输出1:

1

样例输入2:

10

111

000

110

001

001

110

101

011

111

001

输出2:

4

我的代码:40pts,没法下载错误数据

#include<bits/stdc++.h>
#define debug cout << "OK" << endl;
using namespace std;

int n, m, mx = 0;
bool clr[510][510];
int dp[510][510][2][2]; //dp[i][j][0/1][0/1]:以点i,j为右下角/左下角的最大矩形的纵向长度/横向长度 

int main()
{
	scanf("%d %d", &n, &m);
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= m; j++)
		{
			char c;
			scanf(" %c", &c);
			clr[i][j] = (c == '1');
		}
	}
	for(int i = 1; i <= n; i++)
	{
		for(int j = 1; j <= m; j++)
		{
			if(clr[i][j])
			{
				continue;
			}
			int m1 = 0, m2 = 0, m3 = 0;
			for(int k = i - 1; k > 0 && !clr[k][j]; k--)
			{
				m1++;
			}
			for(int k = j - 1; k > 0 && !clr[i][k]; k--)
			{
				m2 ++;
			}
			for(int k = j + 1; k <= m && !clr[i][k]; k++)
			{
				m3++;
			}
			dp[i][j][0][0] = min(dp[i - 1][j - 1][0][0], m1) + 1;
			dp[i][j][0][1] = min(dp[i - 1][j - 1][0][1], m2) + 1;
			dp[i][j][1][0] = min(dp[i - 1][j + 1][1][0], m1) + 1;
			dp[i][j][1][1] = min(dp[i - 1][j + 1][1][1], m3) + 1;
			mx = max(mx, max(dp[i][j][0][0] * dp[i][j][0][1], dp[i][j][1][0] * dp[i][j][1][1]));
		}
	}
	cout << mx << endl;
	
 	return 0;
}

大佬轻喷爆踩

2023/3/11 21:50
加载中...