1. 程式人生 > >演算法設計分析:相鄰最大矩形面積

演算法設計分析:相鄰最大矩形面積

相鄰最大矩形面積
時間限制: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;
}