zoukankan      html  css  js  c++  java
  • poj 2559求柱形图中最大矩形

    两种解法。当中一种是用单调栈。

    我想到的是第二种:最大的矩形,中间一定有个最矮的某个单位矩形。所以求出每一个包括矩形histogram[i]的最大矩形的面积。输出这些面积中最大那个就可以。

    key:用两个数组记录histogram[i]左右两边第一个比它小的单位矩形的序号leftLowerId[i]和rightLowerId[i]。那么对于histogram[i],它自己的最大矩形面积就是(rightLowerId[i] - leftLowerId[i] - 1) *  histogram[i]。

      这里找leftLowerId和rightLowerId的时候用DP加速。以rightLowerId为例,找到右边比histogram[i]矮的矩形,停止,遇到比histogram[i]高的矩形j,直接跳到比histogram[j]矮的矩形rightLowerId[j].


    #include<iostream>
    using namespace std;
    
    
    //the histogram stored from left to right
    long histogram[100001];
    int rightLowerId[100001];
    int leftLowerId[100001];
    
    
    //from right to left
    void FindRightSideLowerRec(int n)
    {
    	rightLowerId[n - 1] = n; // there is no rectangle on its right
    	for (int i = n - 2; i >= 0; i--){
    
    		int cid = i + 1;
    		while (histogram[cid] >= histogram[i] && cid < n){
    			cid = rightLowerId[cid]; // the key
    		}
    
    		rightLowerId[i] = cid;
    	}
    }
    
    //from left to right
    void FindLeftSideLowerRec(int n)
    {
    	leftLowerId[0] = -1; // there is no rectangle on its left
    	for (int i = 1; i < n; i++){
    
    		int cid = i - 1;
    		while (histogram[cid] >= histogram[i] && cid > -1){
    			cid = leftLowerId[cid]; // the key
    		}
    
    		leftLowerId[i] = cid;
    	}
    }
    
    long long CalLargestRectangle(int n)
    {
    	long long largestArea = 0;
    
    	for (int i = 0; i < n; i++)
    	{
    		long long width = rightLowerId[i] - leftLowerId[i] - 1;
    		long long height = histogram[i];
    
    		long long area = width * height;
    
    		if (area > largestArea)
    			largestArea = area;
    	}
    
    	return largestArea;
    }
    
    int main()
    {
    	int n;
    	while (scanf("%d", &n)){
    		if (n == 0)
    			return 0;
    
    		for (int i = 0; i < n; i++)
    		{
    			scanf("%d", &histogram[i]);
    		}
    
    		FindRightSideLowerRec(n); 
    		FindLeftSideLowerRec(n);
    		long long larea = CalLargestRectangle(n);
    
    		printf("%I64d
    ", larea);
    
    	}
    }


  • 相关阅读:
    jQuery Deferred和Promise的使用介绍:
    asp.net客户端IP跟踪
    jquery常用的一些方法
    前端音频流播放
    c# Http请求下载二进制流文件
    iView表格行验证问题
    【已解决】Https请求—未能创建 SSL/TLS 安全通道
    安全开发规范
    数据库设计规范
    高性能开发规范
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7142133.html
Copyright © 2011-2022 走看看