1. 程式人生 > 其它 >CCF題庫——201312-3最大的矩形

CCF題庫——201312-3最大的矩形

技術標籤:演算法題演算法

試題編號:201312-3
試題名稱:最大的矩形
時間限制:1.0s
記憶體限制:256.0MB
問題描述:

問題描述

  在橫軸上放了n個相鄰的矩形,每個矩形的寬度是1,而第i(1 ≤ i ≤ n)個矩形的高度是hi。這n個矩形構成了一個直方圖。例如,下圖中六個矩形的高度就分別是3, 1, 6, 5, 2, 3。



  請找出能放在給定直方圖裡面積最大的矩形,它的邊要與座標軸平行。對於上面給出的例子,最大矩形如下圖所示的陰影部分,面積是10。

輸入格式

  第一行包含一個整數n,即矩形的數量(1 ≤ n ≤ 1000)。
  第二行包含n 個整數h1, h2, … , hn,相鄰的數之間由空格分隔。(1 ≤ hi≤ 10000)。hi是第i個矩形的高度。

輸出格式

  輸出一行,包含一個整數,即給定直方圖內的最大矩形的面積。

樣例輸入

6
3 1 6 5 2 3

樣例輸出

10


本題看似麻煩,實際上是一個可以尋找到規律的模擬題,思路:

矩形的寬和高分別為相應大矩形中小矩形個數以及對應小矩形的最“矮”的高,故可以按照大矩形中小矩形個數劃分大矩形。大矩形寬:1~n,根據觀察可知,寬為n的大矩形只有一個,寬為n-1的大矩形為2個,可得寬為n-i的大矩形有i+1個;進而可得尋大矩形的規律:從寬為n開始按照對應大矩形個數,由位置0到i劃分大矩陣並求出對應面積,在這期間不斷更新最大面積值,最終得出結果。(語言表達能力欠缺,如果不清楚則看程式碼)

#include <iostream>

using namespace std;

int main(){
    int n;
    int store1[1001];
    cin >> n;
    for(int i = 0; i < n; i++)
        cin >> store1[i];
    int num = (n * (n + 1))/2, mmax = 0;
    for(int i = n; i > 0; i--){  //i標識矩形中小矩形的數量
        for(int j = 0; j <= n - i; j++){   // j標識每個大矩形的起始位置
            int k = i, g = store1[j];
            for(int t = 0; t < i; t++){ //t標識大矩形中小矩形的位置
                if(store1[t + j] < g)
                    g = store1[t + j];
            }
            if(g * k > mmax)
                mmax = g * k;
        }
    }
    cout << mmax << endl;
    return 0;
}

這道題初看直接想要跳過,但是仔細分析會覺得這道題很簡單。