如何用单调队列的思想实现(不需要给解释直接给代码)小明有一个大小为 N \times MN×M 的矩阵, 可以理解为一个 NN 行 MM 列的二维数组。 我们定义一个矩阵 mm 的稳定度 f(m)f(...

代码如下:

#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", &amp;n, &amp;m);
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m; j ++ )
            scanf("%d", &amp;a[j]);

    scanf("%d", &amp;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 &amp;&amp; a[q[tt]] >= a[r]) tt -- ;
            q[ ++ tt] = r;
            while (hh <= tt &amp;&amp; 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;
}

需要注意的是,上述代码是求出矩阵中的最大子矩阵的面积,如果要求出稳定度最大的子矩阵,需要改变判断条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值