更多题目请看CCF历年真题汇总
题目描述
思路
枚举每个矩形该作为左边界,向右扩展,计算矩形面积。(注意矩形高度一定是枚举过的所有矩形高度中的最小值,这样才能构成大矩形)
复杂度 : O(n2)
n = 1000, 复杂度满足要求
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int h[N];
int n;
int cal(int pos)
{
int a = h[pos]; //当前的高度
int res = 0;
for(int i=pos; i<n; i++) { //枚举宽度。从当前边界开始,一直到最后
a = min(a, h[i]); //取高度的最小值,才能构成矩形
res = max(res, (i-pos+1)*a); //计算,取面积最大值
}
return res;
}
int main()
{
cin >> n;
for(int i=0; i<n; i++) {
cin >> h[i];
}
int ans = 0;
for(int i=0; i<n; i++) { //枚举边界
ans = max(ans, cal(i)); //计算一当前边界开始,能构成所有矩形的最大面积
}
cout << ans;
return 0;
}