ACM训练日记—8月14日

本文分享了使用单调队列解决直方图中最大矩形及全一的最大子矩阵问题的经验。介绍了如何通过构建单调队列来高效地寻找最优解,并详细解释了具体的算法实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        今天算是艰难的一天,只A了两道题,几乎看了一天的单调队列博客,算是了解了单调队列解决的一类题型。

        第一道题是直方图中最大的矩形,这道题刚看到时感觉很懵,第一反应想到既然是由一个个宽一的矩形排列的直方图,从中找出一块最大矩形,那么这个矩形的高一定是这一排小直方图中其中一个的高,所以我就开始了一个个的找,不出所料超时,再看了许多博客后总算弄懂了,利用单调队列。找两个数组l[n],r[n],用来标记i位置的小矩形向左右两方向扩展可以到那个坐标,利用单调队列,如下一元素大于栈顶,压入,如果小于,扔出栈顶元素继续比较,直到发现栈顶元素小于该元素,记录栈顶元素坐标,如果该元素是最小的,那么标记为1。最后算出每一点左右之间个数乘高度就是了。

            while(!s.empty()) s.pop();
            for(j=1;j<=m;j++)//向左扩展,如果向右扩展要到这找
            {
                while(!s.empty()&&s.top().first>=h[j]) s.pop();
                if(s.empty()) l[j]=1;//可以直接到最左边
                else l[j]=s.top().second+1;//记录向左扩展停止的位置
                s.push(p(h[j],j));
            }

     第二道题全一的最大子矩阵,给一个只含有0与1的大矩阵,找出其中一个子矩阵只含有1,且最大,求1的数量,其实这道题就和上一道题是一道题了,只需用一个二维数组h[i][j]表示以[i][j]为底向上由扩展多少1(a[i][j]==1),由此将这道题转换成上面那道题,剩下的只要算出每一行就行了。

     感觉好像越做越慢了,还是对单调队列掌握不够好,不过感觉虽然今天A的题不多,但收获还是不小的。明天要加油了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值