<span>二维图中找最大子矩阵的方法</span>

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;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-27 14:11
很喜欢小米的新车,校招薪资每月22k,攒多久能买?
测试糕手手:别看工资,先看现金流存款。有50W存款以上再考虑,车是消耗品,选适合自己的重要。你有钱就当我没说过
点赞 评论 收藏
分享
05-25 10:45
门头沟学院 Java
Frank_zhan...:没实习一个项目肯定不够,可以再做一个轮子,技术栈再补一个mq,微服务,整体再换个简历模板,暑期尽量再找一个日常实习
无实习如何秋招上岸
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务