LC的课后辅导
发布时间: 2015年9月19日 21:42 时间限制: 1000ms 内存限制: 256M
有一天,LC给我们出了一道题,如图:
这个图形从左到右由若干个 宽为1 高不确定 的小矩形构成,求出这个图形所包含的最大矩形面积。
多组测试数据
每组测试数据的第一行为n(0 <= n <= 100), 表示图形有n个小矩形构成
接下来一行输入n个整数h1, h2...hn(0 <= hi <= 1000), 表示每个小矩形的高度
n为0时程序结束
仅输出一行表示面积的最大值
复制
7 2 1 4 5 1 3 3 4 1000 1000 1000 1000 0
8 4000
遍历每一个点,确定出该点可以延伸到的端点,就确定了矩形的底,再乘以该点的值就是面积
#include<stack>
#include<cstdio>
#include<climits>
using namespace std;
const int M = 105;
int a[M];
int L[M];
int R[M];
stack<int> st;
int main()
{
int n;
while(~scanf("%d", &n)&&n)
{
for(int i=1;i<=n;i++)
{
scanf("%d", &a[i]);
}
while(st.size())
st.pop();
for(int i=1;i<=n;i++)//确定左端点
{
while(!st.empty()&&a[st.top()]>=a[i])
st.pop();
if(st.empty())
L[i] = 1;
else
L[i] = st.top() + 1;
st.push(i);
}
while(st.size())
st.pop();
for(int i=n;i>0;i--)//确定右端点
{
while(!st.empty()&&a[st.top()]>=a[i])
st.pop();
if(st.empty())
R[i] = n;
else
R[i] = st.top() - 1;
st.push(i);
}
int ans=INT_MIN,tmp;
for(int i=1;i<=n;i++)
{
tmp = (R[i] - L[i] + 1)*a[i];
ans = max(ans, tmp);
}
printf("%d\n", ans);
}
return 0;
}