• 【POJ 2559】Largest Rectangle in a Histogram【栈】


    题目大意:

    题目链接:http://poj.org/problem?id=2559
    给出一个直方图,在不超过其边界且要求底边和高分别平行于第和最左边直方图的高的情况下,找到其中的最大面积长方形。
    本题由多组数据。


    思路:

    思路一:
    先枚举每一个直方图,再直接暴力左右扩展边界,直到无法扩展为止。时间复杂度O(t×n2),十分不优秀。


    思路二:
    先用ST求出每个区间的最小值,然后再枚举每一个直方图,利用最小值求出左右边界。时间复杂度$O(t\times nlogn),依旧不优秀。


    思路三:
    考虑利用栈并且保持栈的单调性,当h[s.top()]>a[i]时,就不断pop掉,并求出最大值。时间复杂度O(tn),优秀。

    while (q.size()&&a[q.top()]>a[i])
    {
            sum+=b[q.top()];    
            ans=max(ans,sum*a[q.top()]);
            q.pop();
    }   

    代码:

    #include <cstdio>
    #include <stack>
    #include <iostream>
    #include <cstring>
    #define N 100100
    using namespace std;
    
    long long ans,sum,a[N+1],b[N+1];
    int n;
    stack<long long> q;
    
    int main()
    {
        while (1)
        {
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            ans=sum=0;  
            while (q.size()) q.pop(); //初始化
            scanf("%d",&n);
            if (!n) return 0;
            for (int i=1;i<=n;i++)
            {
                scanf("%lld",&a[i]);
            }
            q.push(1); 
            b[1]=1;  //先将第一个图放入栈
            for (int i=2;i<=n+1;i++)
            {
                if (q.size()&&a[q.top()]<=a[i])  //保持单调
                {
                    q.push(i);
                    b[i]=1;  //宽度
                }
                else
                {
                    sum=0;
                    while (q.size()&&a[q.top()]>a[i])  //不单调
                    {
                        sum+=b[q.top()];  //增加宽度
                        ans=max(ans,sum*a[q.top()]);
                        q.pop();
                    }   
                    q.push(i);
                    b[q.top()]=sum+1;  //宽度
                }
            } 
            cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    Spring、Spring Boot 和 Spring Cloud 的关系
    Spring Boot 如何设置支持跨域请求?
    什么是嵌入式服务器?我们为什么要使用嵌入式服务器呢?
    nginx配置域名,不要端口
    域名解析以及nginx服务器设置
    为什么使用nginx
    RabbitMQ下载与安装(window版)
    spring的@ComponentScan注解
    spring的@EnableScheduling注解
    日志切割: logrotate、python、shell实现
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998748.html
Copyright © 2020-2023  润新知