给定n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为1
求在该柱状图中,能够勾勒出来的矩形的最大面积。
#示例一
输入:
6
2,1,5,6,2,3
输出:10
解释:最大的矩形为图中红色区域,面积为 10
动态规划
用left表示第i个柱子可以最多向左延伸至第left个柱子,形成一个矩形,right则表示向右延伸。遍历两次,分别计算出这两个构成的最大柱子宽度。
再遍历一次,即可求出所有的柱子可以形成的最大的矩形面积
#include <stdio.h>
int main(int argc, char const* argv[])
{
/*设直方图横坐标为1*/
int cnt,n;
int S_max = 0; //最大面积
scanf("%d",&n);
int air[n]; //直方图
int sum[1000] = {0}; //保存每一次的面积
for(int i=0; i<n; i++)
{
scanf("%d",&air[i]);
}
for(int i = 0; i<n; i++) //从头开始遍历
{
cnt = 1; //记录每一次横坐标的长度
/*判断air[i]右边的每一个矩形,如果存在小于等于air[i]的数则cnt长度加1,
并且j小于等于最大下标*/
for(int right = i+1; right<n&&air[i]<=air[right]; right++)
{
cnt ++;
}
/*判断air[i]右边的每一个矩形,如果存在小于等于air[i]的数则cnt长度加1,
并且j小于等于最小下标*/
for(int left = i-1; left>=0&&air[i]<=air[left]; left--)
{
cnt ++;
}
sum[i] = air[i]*cnt; //记录每一次找到的最大面积
/*判断air[i]为最大矩形和air[i]为最后一个矩形的情况*/
if(air[i]>air[i+1] || i == n-1)
{
sum[i] = air[i];
}
}
for(int i = 0; i<n; i++) //得到最大面积
{
if(sum[i]>S_max)
{
S_max = sum[i];
}
}
printf("%d",S_max);
}