最大矩形面积问题

来源:互联网 发布:淘宝虚拟订单生成器 编辑:程序博客网 时间:2024/04/27 22:39

★问题描述:
在X轴上水平放置着N个条形图,这N个条形图就组成了一个柱状图,每个条形图都是一个矩形,每个矩形都有相同的宽度,均为1单位长度,但是它们的高度并不相同。
例如,下图中,图1包含的矩形的高分别为2,1,4,5,1,3,3单位长度,矩形的宽为1单位长度。


你的任务就是计算柱状图中以X轴为底边的最大矩形的面积。图2阴影部分就是上述例子的最大矩形面积。
★数据输入:
输入数据的第一行是一个整数N(1≤N≤100,000),表示柱状图包含N个矩形。紧接着N个整数h1,...,hn(0≤ hi ≤20,000, 1≤ i≤ N),表示柱状图中按从左到右顺序给出的矩形的高度。矩形的宽度为1。
★结果输出:
输出一个整数S,表示以X轴为底边的最大矩形的面积。
输入示例                                 输出示例
7 2 1 4 5 1 3 3                              8

 

 

 

下面是我的代码,欢迎大家改进:

#include<iostream>
using namespace std;
#include<vector>

int main()
{
 int n;//n个条形图
 int i=0,j=0,k=0;//循环变量
 int height;//定义每个矩形的高度
 while(cin>>n)
 {
  vector<int> v_height,v_left,v_right,v_area;
  v_height.push_back(0);//在第一个前面加上一个高度为0的矩形
  for(i=1;i<=n;i++)
    {
  cin>>height;
  v_height.push_back(height);//把高度存进去
    }
  v_height.push_back(0);//在最后一个后面加上一个高度为0的矩形

  for(i=1;i<=n;i++)//对每个矩形进行遍历
     {
     //---求从左往右遍历找到所有柱形左边的第一个高度比它小的柱形,并将其X坐标值存入到v_left对应的元素中
    for(j=i;j>=0;)
     {
    if(j==0)
    {
    v_left.push_back(0);
    break;
    }
     
   if(v_height[j]>v_height[j-1])
   {
    int lpos=j-1;
    v_left.push_back(lpos);
    break;
   }
   else
    j--;
    }

     //---求从左往右遍历找到所有柱形右边的第一个高度比它小的柱形,并将其X坐标值存入到v_right对应的元素中
  for(j=i;j<=n;)
    {
   if(j==n)
   {
    v_right.push_back(n+1);
    break;
   }
     
   if(v_height[j]>v_height[j+1])
   {
    int rpos=j+1;
    v_right.push_back(rpos);
    break;
   }
   else
    j++;
    }
       }

  //--计算面积并且存入v_area
  for(k=1;k<=n;k++)
  {
   int area=v_height[k]*(v_right[k-1]-v_left[k-1]-1);
   v_area.push_back(area);
  }

  int max=v_area[0];
  for(k=1;k<n;k++)
  {
   if(max<v_area[k])
    max=v_area[k];
  }
  cout<<max;
 }//while()结束
}