分治思想应用题

给定一组非负整数组成的数组h,代表一组柱状图的高度,其中每个柱子的宽度都为1。 在这组柱状图中找到能组成的最大矩形的面积(如图所示)。 入参h为一个整型数组,代表每个柱子的高度,返回面积的值。
 

 

输入描述:
输入包括两行,第一行包含一个整数n(1 ≤ n ≤ 10000)
第二行包括n个整数,表示h数组中的每个值,h_i(1 ≤ h_i ≤ 1,000,000)


输出描述:
输出一个整数,表示最大的矩阵面积。

 

输入例子1:
6
2 1 5 6 2 3

 

输出例子1:
10
代码:

#include<iostream>
#include<vector>
using namespace std;
int sort(int *a, int low, int high)
{

 int min = low;
 for (int i = low + 1; i <= high; i++)
 {
  if (a[i]<a[min])
   min = i;
 }
 return min;
}
int area(int *a, int low, int high)
{
 int pivot;
 int area_max;
 if (low == high)
  return a[low];
 else if (low<high)
 {
  int area_1, area_2, area_3;
  pivot = sort(a, low, high);
  area_2 = (high - low + 1)*a[pivot];
  area_1 = area(a, low, pivot - 1);
  area_3 = area(a, pivot + 1, high);

  area_max = (area_1>area_2) ? area_1 : area_2;
  area_max = (area_3>area_max) ? area_3 : area_max;
  return area_max;
 }
 return 0;
}

int main()
{
 /*int n = 0, hi = 0, sum = 0;
 vector<int>h;
 vector<vector<int>>sumjm;
 cin >> n;
 h.push_back(n);
 while (n--)
 {
  cin >> hi;
  h.push_back(hi);
 }*/
 int N;
 while (cin >> N)
 {
  int * p = new int[N];
  for (int i = 0; i<N; i++)
    cin >> p[i];
  int max = area(p, 0, N - 1);
  cout << max;
  }
 return 0;
}

posted on 2018-09-27 19:28  Rakint  阅读(157)  评论(0编辑  收藏  举报