代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
int n, m, limit;
int a[N], q[N];
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= m; j ++ )
scanf("%d", &a[j]);
scanf("%d", &limit);
int res = 0;
for (int l = 1; l <= m; l ++ )
{
int hh = 0, tt = -1;
for (int r = l; r <= m; r ++ )
{
while (hh <= tt && a[q[tt]] >= a[r]) tt -- ;
q[ ++ tt] = r;
while (hh <= tt && a[q[hh]] <= a[r] - limit) hh ++ ;
if (hh <= tt) res = max(res, (r - l + 1) * (a[q[hh]] - a[q[tt]] <= limit ? r - q[hh] + 1 : q[hh] - l));
}
}
printf("%d\n", res);
return 0;
}
需要注意的是,上述代码是求出矩阵中的最大子矩阵的面积,如果要求出稳定度最大的子矩阵,需要改变判断条件。