Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2877494
  • 博文数量: 471
  • 博客积分: 7081
  • 博客等级: 少将
  • 技术积分: 5369
  • 用 户 组: 普通用户
  • 注册时间: 2012-01-04 21:55
文章分类

全部博文(471)

文章存档

2014年(90)

2013年(69)

2012年(312)

分类: C/C++

2012-07-10 09:22:16

A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different heights. For example, the figure on the left shows the histogram that consists of rectangles with the heights 2, 1, 4, 5, 1, 3, 3, measured in units where 1 is the width of the rectangles:

Usually, histograms are used to represent discrete distributions, e.g., the frequencies of characters in texts. Note that the order of the rectangles, i.e., their heights, is important. Calculate the area of the largest rectangle in a histogram that is aligned at the common base line, too. The figure on the right shows the largest aligned rectangle for the depicted histogram.
 

Sample Input
7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0
 

Sample Output
8
4000
给出n(n<=100000)个木板的高度,宽度均为1,将n个木板竖成一排,在上面截取长方形,求最大面积。
 

点击(此处)折叠或打开

  1. #include<stdio.h>
  2. #include<stack>
  3. using namespace std;
  4. __int64 rec[100010];
  5. int main()
  6. {
  7.     int n;
  8.     while(scanf("%d",&n)!=EOF && n!=0)
  9.     {
  10.         stack<int> s;//栈一直保持着坐标对应的值单调递增,4,5,7,8 来了个6,最后4,5,6
  11.         
  12.         __int64 max_area=0,sum=0;//保存着最大的面积
  13.         for(int i=0;i<n;i++)
  14.         {
  15.             scanf("%I64d",&rec[i]);
  16.         }
  17.         rec[n]=-1;
  18.         int temp_index;
  19.         for(int j=0;j<=n;j++)
  20.         {
  21.             if(s.empty()||rec[s.top()]<rec[j])//先把大于栈顶的弄进栈
  22.                 s.push(j);//j对应高度所在的坐标,rec[j]对应它的高度
  23.             else if(rec[s.top()]>rec[j])//相等的直接跳过,j-s.top()已经可以计算
  24.             {
  25.                 while(!s.empty() && rec[s.top()]>rec[j])
  26.                 {
  27.                     sum=(j-s.top())*rec[s.top()];//不断向左扩展,看图
  28.                     if(max_area<sum)
  29.                         max_area=sum;
  30.                     temp_index=s.top();
  31.                     s.pop();
  32.                 }
  33.                 s.push(temp_index);
  34. //重新开始,此时temp_index下标表示以rec[j]为高度的矩形的左边的边界(因为盏是递减的,所以左边的比右边的高)
  35.                 rec[temp_index] = rec[j];
  36. //这里注意理解,把rec[j]的值赋值给rec[temp](原来的高度已经没用了),此时它表示的是高为rec[j]的矩形
  37.             }

  38.         }
  39.         printf("%I64d\n",max_area);

  40.     }
  41.     return 0;
  42. }

 
阅读(1130) | 评论(1) | 转发(0) |
0

上一篇::List+Map 实现1:N

下一篇:单调栈描述

给主人留下些什么吧!~~

nba76ers2012-07-10 11:41:55

出栈的时候,一直出到小于或者等于rec [j],把此时的temp_index(已经出了)入栈,那么栈又保持着单调递增,这样再以rec[j]向右扩展很简单的