演算法設計分析:相鄰最大矩形面積
相鄰最大矩形面積
時間限制:1000MS 記憶體限制:65535K
描述
在X軸上水平放置著 N 個條形圖,這 N 個條形圖就組成了一個柱狀圖,每個條形圖都是一個矩形,每個矩形都有相同的寬度,均為1單位長度,但是它們的高度並不相同。求出最大的矩形
輸入格式
輸入資料的第一行是一個整數 N(1≤N≤100,000),表示柱狀圖包含 N 個矩形。緊接著 N 個整數h1,...,hn(0≤ hi ≤20,000, 1≤ i≤ N),表示柱狀圖中按從左到右順序給出的矩形的高度。矩形的寬度為1。
輸出格式
輸出一個整數S,表示以X軸為底邊的最大矩形的面積。
輸入樣例
7
2 1 4 5 1 3 3
輸出樣例
8
Hint
這個問題,用簡單的方法分析,尋找相鄰幾個矩形豎條最矮個構成的大矩形。O(n^2)的演算法是比較容易實現的。需要考慮的是能否有更好搜尋辦法降下這個複雜度。
不涉及分治,動規等方法。
#include"stdio.h"
int rect[100001] = {0};
int high[100001] = {0};
int wide[100001] = {0};
long count = 1;
long n;
long sum = 0;
bool Check(int list[],int k,int l,int key){
for(long i = k;i <= l;i++)
if(key == list[i])
return true;
return false;
}
void sort(){
int temp;
for(long i = 0; i < count - 1; i++)
for(long j = 0; j < count - i -1; j++)
if(high[j] > high[j + 1]){
temp = high[j];
high[j] = high[j + 1];
high[j + 1] = temp;
}
}
long unite(){
if(n == 1)return rect[1];
for(long i = 0; i < count; i++){
for(long j = 0; j <= n; j++)wide[j] = 0;
for(long j = 1; j <= n; j++){
if(rect[j] >= high[i]){
wide[j] = wide[j - 1] + 1;
sum = wide[j] * high[i] > sum ? wide[j] * high[i] : sum;
}
}
}
}
int main(){
scanf("%ld",&n);
for(long i = 1; i <= n; i++){
scanf("%d",&rect[i]);
if(i == 1)high[0] = rect[i];
else if(!Check(high,0,count - 1,rect[i]))
high[count++] = rect[i];
}
sort();
// for(int i = 0; i < count; i++)
// printf("%d ",high[i]);
printf("%ld\n",unite());
return 1;
}