最大的矩形

http://blog.csdn.net/pipisorry/article/details/39434499


时间限制: 1.0s 
内存限制: 256.0MB 

问题描述

在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。

请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。

输入格式

第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。

第二行包含n 个整数h1, h2, … , hn,相邻的数之间由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i个矩形的高度。

输出格式
输出一行,包含一个整数,即给定直方图内的最大矩形的面积。
样例输入

6

3 1 6 5 2 3

样例输出
10 


code:

//****************************************************************************************************/
//*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;
}


from:http://blog.csdn.net/pipisorry/article/details/39434499


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值