最大的矩形

来源:互联网 发布:安卓 模拟经营 知乎 编辑:程序博客网 时间:2024/05/22 16:43
问题描述

在横轴上放了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
算法:
  1. 算法开始。
  2. 读入n。
  3. 依次读取n个数据,存储于array里。
  4. i=0。maxarea=0,height = 0,width = 0。
  5. 如果i小于n,则继续,否则跳到第十三步。
  6. j=i+1。height=array[i],width=1,如果maxarea<height * width,maxarea = height * width。
  7. 如果j小于n,则继续,否则跳到第十二步。
  8. 如果array[j]<height,则height=array[j]。
  9. width++。
  10. 如果maxarea < height * width,则maxarea = height * width。
  11. j++。回到第八步。
  12. i++。回到第五步。
  13. 输出maxarea。
  14. 算法结束。

#include <stdio.h>#include <stdlib.h>int main(int argc, const char * argv[]) {    int n, *h = NULL, maxarea = 0, height, width, i, j;    scanf("%d", &n);    h = (int*)calloc(n, sizeof(int));    for(i = 0; i < n; i++){        scanf("%d", h + i);    }    for(i = 0; i < n; i++){        height = h[i];        width = 1;        if(maxarea < height * width){            maxarea = height * width;        }        for(j = i + 1; j < n; j++){            if(h[j] < height){                height = h[j];            }            width++;            if(maxarea < height * width){                maxarea = height * width;            }        }    }    printf("%d", maxarea);    return 0;}

0 0
原创粉丝点击