最大的矩形

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

时间: 2024-10-13 11:45:13

最大的矩形的相关文章

洛谷——P1034 矩形覆盖

https://www.luogu.org/problem/show?pid=1034 题目描述 在平面上有 n 个点(n <= 50),每个点用一对整数坐标表示.例如:当 n=4 时,4个点的坐标分另为:p1(1,1),p2(2,2),p3(3,6),P4(0,7),见图一. 这些点可以用 k 个矩形(1<=k<=4)全部覆盖,矩形的边平行于坐标轴.当 k=2 时,可用如图二的两个矩形 sl,s2 覆盖,s1,s2 面积和为 4.问题是当 n 个点坐标和 k 给出后,怎样才能使得覆盖所

[bzoj2517]矩形覆盖

Description 给定一个$l\;\times\;w$的矩形,和$n$个圆,求最小的$k$使得每个圆的半径$\;\times\;k$后,能覆盖整个矩形. Input 第一行一个整数$T$,表示数据组数. 以下$T$组数据,每组数据第一行三个整数$N,L,W$,表示圆个数和矩形大小. 接下来$N$行,每行三个正整数$x[i],y[i],R[i]$表示一个圆心的坐标和原始半径. Output 对于每组数据,输出一个实数$K$,保留$3$位小数. Sample Input 1 1 2 2 1 1

BZOJ2338: [HNOI2011]数矩形

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2338 中学数学老师告诉我们,一个矩形的两条对角线相等,所以只要把所有的边拿出来,记录下中点坐标及长度,然后排一遍序扫一遍更新答案..(听说开double会炸? #include<cstring> #include<cstdio> #include<algorithm> #include<cmath> #include<iostream> #i

BZOJ 1185 HNOI 2007 最小矩形覆盖 旋转卡壳

题目大意:给出平面上的一些点,问面积最小的矩形满足覆盖所有的点. 思路:覆盖问题和不是凸包上的点没关系,先做凸包.根据贪心的思想,这个覆盖了所有点的矩形肯定至少有一条边与凸包上的边重合,那么我们枚举凸包上的每一条边,对于这个已经确定了一条边的矩形,不难确定其他三个边.注意到已知当前直线的向量,就可以求出两侧和对面的向量,而这三个向量随着枚举的边的移动是单调的,所以就可以用旋转卡壳来卡住剩下的三条边. 但是旋转卡壳时的初值会出问题,如果按照逆时针的顺序求出剩下的三条边的时候,要想通过向量直接卡第三

HDU 1828 Picture(矩形周长并)

HDU 1828 Picture 题目链接 题意:给定n个矩形,输出矩形周长并 思路:利用线段树去维护,分别从4个方向扫一次,每次多一段的时候,就查询该段未被覆盖的区间长度,然后周长就加上这个长度,4个方向都加完就是答案 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 5005; int n; struct Rec { int

南洋理工大学 ACM 在线评测系统 矩形嵌套

矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有n个矩形,每个矩形可以用a,b来描述,表示长和宽.矩形X(a,b)可以嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).例如(1,5)可以嵌套在(6,2)内,但不能嵌套在(3,4)中.你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每一个矩形都可以嵌套在下一个矩形内. 输入 第一行是一个正正数N(0<N<10),表示测试数据组数,每组测

POJ 1410 判断线段与矩形交点或在矩形内

这个题目要注意的是:给出的矩形坐标不一定是按照左上,右下这个顺序的 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define eps 1e-8 #define INF 1e9 using namespace std; const int maxn=100; typedef struct Point {

hdu1542 Atlantis(扫描线+线段树+离散)矩形相交面积

题目链接:点击打开链接 题目描写叙述:给定一些矩形,求这些矩形的总面积.假设有重叠.仅仅算一次 解题思路:扫描线+线段树+离散(代码从上往下扫描) 代码: #include<cstdio> #include <algorithm> #define MAXN 110 #define LL ((rt<<1)+1) #define RR ((rt<<1)+2) using namespace std; int n; struct segment{ double l

maximal-rectangle——找出最大矩形的面积

Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing all ones and return its area. PS:将其化解为柱状图求最大体积的问题.先用动态规划的思路,将矩形中垂直方向的连续1的数量进行计算. 而后逐行扫描,并在扫描时将其转化为柱状图求体积. 即若高度一直增加,则持续压入栈,当出现h[i]<栈顶高度时,则出栈,并计算出栈元素的所在矩形的体积.持续计算直到

矩形嵌套-记忆化搜索(dp动态规划)

矩形嵌套 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 有n个矩形,每个矩形能够用a,b来描写叙述,表示长和宽. 矩形X(a,b)能够嵌套在矩形Y(c,d)中当且仅当a<c,b<d或者b<c,a<d(相当于旋转X90度).比如(1,5)能够嵌套在(6,2)内,但不能嵌套在(3,4)中. 你的任务是选出尽可能多的矩形排成一行,使得除最后一个外,每个矩形都能够嵌套在下一个矩形内. 输入 第一行是一个正正数N(0<N<10).表示測试数据组