您的位置:首页 > 其它

最大的矩形

2015-03-27 10:06 316 查看


输入格式

第一行包含一个整数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
;

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: