Minieye杯第十五届华中科技大学程序设计邀请赛现场同步赛
题目链接:https://ac.nowcoder.com/acm/contest/700/I
思路:可以用两个数组分别储存最大值和最小值,依次更新最大值矩阵和最小值矩阵;
更新为2阶的,它会逐渐扩大范围,所以每扩大一阶,更新一次即可;
代码如下:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<set>
#include<map>
#include<vector>
#include<stack>
#define LL long long
using namespace std;
int maxn[502][502],minn[502][502],og[502][502];
int n,m;
void fre(int k)
{
for(int i = 0;i + k <= n;i++)
{
for(int j = 0;j + k <= m;j++)
{
maxn[i][j] = max(maxn[i][j],max(maxn[i][j+1],max(maxn[i+1][j],maxn[i+1][j+1])));
minn[i][j] = min(minn[i][j],min(minn[i][j+1],min(minn[i+1][j],minn[i+1][j+1])));
}
}
}
int main()
{
int g;
cin >> n >> m >> g;
for(int i = 0;i < n;i++)
for(int j = 0;j < m;j++)
{
cin >> og[i][j];
maxn[i][j] = minn[i][j] = og[i][j];
}
int l = 1;
for(int k = 2;k < min(n,m);k++)
{
int fl = 0;
fre(k);
for(int i = 0;i + k <= n;i++)
for(int j = 0;j + k <= m;j++)
{
if(maxn[i][j] - minn[i][j] <= g)
{
l = k;
break;
}
}
}
cout << l << endl;
return 0;
}