201312-3-最大的矩形

题目

问题描述
  在横轴上放了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

我的代码

#include <iostream>
using namespace std;
int scan(int *a,int n,int i,int depth)
{
	int j,width=1;
	for(j=0;j<n;j++)
		if(a[j]>=0)
			break;
	if(j==n)
		return -1;
	if(a[i]<0)
		return 0;
	for(j=i-1;j>=0;j--)
		if(a[j]>=0)
			width++;
		else
			break;
	for(j=i+1;j<n;j++)
		if(a[j]>=0)
			width++;
		else
			break;	
	return depth*width;
}
int main(int argc, char *argv[]) {
	int num,i,max=0,res,depth;
	int a[1000]={0};
	cin>>num;
	for(i=0;i<num;i++)
		cin>>a[i];
	for(depth=1;;depth++)
	{
		for(i=0;i<num;i++)
			a[i]--;
		res=scan(a,num,0,depth);
		if(res<0)
			break;
		else
		{
			if(res>max)
				max=res;
		}
		for(i=1;i<num;i++)
		{
			res=scan(a,num,i,depth);
			if(res>max)
				max=res;
		}
	}	
	cout<<max;	
	return 0;
}

我的思路

我考虑的标准是深度,矩形深度为1时,找出最大的深度为1的矩形,然后依次到深度为2的矩形,然后递增…到深度为最高矩形的高度为止

参考答案及注释解析

#include <iostream> 
#include <cstdio> 
#include <string> 
#include <vector>
#include <deque> 
#include <list> 
using namespace std;
int main() {
	int n;
	vector<int> a;//定义一个向量,基本数据类型为int
	cin >> n;
	for (int i = 0; i < n; i++) {
		int x;
		cin >> x;
		a.push_back(x);//将每一个矩形的高度存入向量
	}
	int ans = 0;
	for (int i = 0; i < n; i++) {
		int h = a[i];//以当前目标立柱为标准
		for (int j = i; j < n; j++) {
			if (a[j] < h)     h = a[j];//向后扫描,寻找可以容忍的最大高度
			int s = (j - i + 1) * h;//计算扫描得出来的面积
			if (ans < s)     ans = s;//更新最大面积
		}
	}
	cout << ans << endl;//打印结果
	return 0;
}
发布了17 篇原创文章 · 获赞 0 · 访问量 261

猜你喜欢

转载自blog.csdn.net/qq_41985293/article/details/104108988
今日推荐