• SP1805 Largest Rectangle in a Histogram


    题目链接:###

    洛谷SP1805

    题意:###

     如图所示,在一条水平线上有n个宽为1的矩形,求包含于这些矩形的最大子矩形面积(图中的阴影部分的面积即所求答案)
    
    输入格式:
    
       有多组测试数据,每组数据占一行。输入零时读入结束。
    
       每行开头为一个数字n(1<=n<=100000),接下来在同一行给出n个数字h1h2...hn(0<=hi<=1000000000)表示每个矩形的高度。
    
    输出格式:
    
       对于每组数据,输出最大子矩阵面积,一组数据输出一行。
    

    题目分析:###

    一道单调栈的典型例题……
    如果矩形高度单增,可以用每个矩形的高度*从这个矩形到最右边的距离得到一个值,然后取最大的就是ans
    如果矩形高度不单调,显然因为右边有比这个矩形高度更矮的矩形所以这个矩形的高度并没有什么卵用

    这个时候前面那些矩形除了宽度已经没什么用了,记一下宽度果断丢掉(丢的时候记宽度,并乘高度以更新答案),然后这样矩形序列就又单增啦
    用单调栈实现,边读边做,每次把比当前矩形高的都弹出来,然后把当前矩形入栈
    最后还要仿照之前的做法把剩下的弹出来更新答案,栈空结束算法,输出答案


    代码:###

    #include<bits/stdc++.h>
    #define MAXN (100000+5)
    using namespace std;
    inline int read(){
    	int f=1,cnt=0;char c;
    	c=getchar();
    	while(!isdigit(c)){if(c=='-')f=-f;c=getchar();}
    	while(isdigit(c)){cnt=cnt*10+c-'0';c=getchar();}
    	return cnt*f;
    }
    int sta[MAXN],w[MAXN],x;
    int n,top=0;
    long long ans=0;
    int main(){
    	while(1){
    		top=0;ans=0;
    		n=read();if(n==0)return 0;
    		sta[0]=0;
    		for(register int i=1;i<=n;i++)w[i]=sta[i]=0;
    		for(register int i=1;i<=n;i++){
    			x=read();
    			if(x>=sta[top]){
    				sta[++top]=x;
    				w[top]=1;
    			}
    			else{
    				int tot=0;
    				while(sta[top]>x){
    					tot+=w[top];
    					ans=max(ans,(long long)tot*sta[top]);
    					top--;
    				}
    				sta[++top]=x;w[top]=tot+1;
    			}
    		}
    		int tot=0;
    		while(top){
    			tot+=w[top];
    			ans=max(ans,(long long)tot*sta[top]);
    			top--;
    		}
    		printf("%lld
    ",ans);
    //		for(register int i=1;i<=n;i++)printf("%d ",sta[i]);
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    使用Dictionary键值对判断字符串中字符出现次数
    Linq实现字符串拼接多条件查询
    js数据类型转换
    js前端数据类型检测typeof,instanceof,Object.prototype.toString.call
    moment.js格式化日期,获取前一个月的时间
    css 样式中height100%失效问题
    记一次react项目运行崩溃
    null和undefined区别
    windows腾讯云/阿里云服务器更换操作系统为linux
    csrf攻击原理和防御-生成token防御代码
  • 原文地址:https://www.cnblogs.com/kma093/p/10291153.html
Copyright © 2020-2023  润新知