输入格式
第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。
第二行包含n 个整数h1, h2, … , hn,相邻的数之间由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i个矩形的高度。
输出格式
输出一行,包含一个整数,即给定直方图内的最大矩形的面积。
样例输入
6
3 1 6 5 2 3
样例输出
10
code:
[cpp] view plaincopy
- //****************************************************************************************************/
- //*CCF软件能力认证考试模拟题 —— 最大矩形Largest Rectangle in a Histogram poj2559<span style="white-space:pre"> </span>皮皮 2014-9-3*/
- //****************************************************************************************************/
- #include <iostream>
- #include <assert.h>
- using namespace std;
- /* ccf标准算法 TLE!!! */ //????????????????
- static void largestRectangle(){
- int n; //直方图柱形数目
- cin>>n;
- int *height = new int[n];
- for(int i = 0; i < n; i++)
- cin>>height[i];
- long long sum, max = 0;
- for(int i = 0; i < n; i++){
- int h = height[i];
- for(int j = i; j < n; j++){ //向右扫描
- if( height[j] < h ) //高度小时改为小的高度
- h = height[j];
- sum = (j - i +1) * h; //计算高度h的矩形面积
- if(sum > max) //比原来大则替换
- max = sum;
- }
- while( i < n - 1 && height[i+1] < height[i] ) //改进:比当前height[i]小的不用再计算(i后面高度比i小的不可能有更大面积的矩形)
- i++;
- }
- cout<<max<<endl;
- }
- static void largestRectangle1(){
- int n;
- cin>>n;
- //while(n){
- int *height = (int *)malloc(sizeof(int) * n);
- for(int i = 0; i < n; i++)
- cin>>height[i];
- int j, k, sum, max = 0;
- for(int i = 0; i < n; i++){
- sum = 1; //初始只有一个这样高度的
- j = i - 1;
- k = i + 1;
- while(j >= 0 && height[j] >= height[i]){ //向左扫描同样高度的有多少个
- sum++;
- j--;
- }
- while(k <= n - 1 && height[k] >= height[i]){ //向右扫描同样高度的有多少个
- sum++;
- k++;
- }
- sum *= height[i]; <span style="white-space:pre"> </span>//计算高度为当前大小的直方柱有多少个(即矩形面积大小)
- if(sum > max)
- max = sum;
- }
- cout<<max<<endl;
- cin>>n;/*
- }*/
- }
- int main(){
- //assert( freopen("CCF\\largestRectangle1.in", "r", stdin) );
- largestRectangle();
- //fclose(stdin);
- return 0;
- }