二维图中找最大子矩阵的方法

https://ac.nowcoder.com/acm/problem/50965
这是一道在直方图中寻找最大子矩形的题目,我们可以通过将单个矩形左右延伸来计算最大值
需要注意的是,这里的数据范围是1e9,所以我们要用long long定义相关变量,否则范围不够
由于数据较多并且大,推荐使用scanf来读取

#include <bits/stdc++.h>
using namespace std;
const int m=1e5+5;
struct node{
    int left,right;//左右边界
    long long height;//高度
}h[m];
long long ma=-1;
int main(){
    int n;
    while(scanf("%d",&n)&&n){
        ma=-1e9;
        for(int i=1;i<=n;i++){
            scanf("%lld",&h[i].height);
            h[i].left=h[i].right=i;//初始化的左右范围都是自己
        }
        h[0].height=-1e9;//为了让边界比较
        h[n+1].height=-1e9;
        for(int i=1;i<=n;i++){
            while(h[i].height<=h[h[i].left-1].height) h[i].left=h[h[i].left-1].left;//更新每个矩形左边边界的值
        }
        for(int i=n;i>=1;i--){
            while(h[i].height<=h[h[i].right+1].height) h[i].right=h[h[i].right+1].right;//更新每个矩形右边边界的值
        }
        for(int i=1;i<=n;i++){//计算最大值
            long long tmp=(h[i].right-h[i].left+1)*h[i].height;
            if(tmp>ma) ma=tmp;
        }
        printf("%lld\n",ma);
    }
    return 0;
}
posted @   Time_Limit_Exceeded  阅读(152)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!

阅读目录(Content)

此页目录为空

点击右上角即可分享
微信分享提示