1. 程式人生 > >CCF 201312-3 最大的矩形[比較簡單]

CCF 201312-3 最大的矩形[比較簡單]

vector 輸出格式 data 空格 輸入格式 out rec 6.0 eight

問題描述

試題編號: 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

題目大意:有n個矩形,寬為1,給出每個點的高度,需要求出最大的矩形的面積。

//猛一看覺得挺難,仔細看看覺得還可以,一次AC~

#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
int rec[1001][1001];
int main() {
    
int n; cin>>n; int maxs=0; for(int i=0;i<n;i++){ cin>>rec[i][i]; if(rec[i][i]>maxs)maxs=rec[i][i]; } for(int i=0;i<n;i++){ int mins=rec[i][i]; for(int j=i+1;j<n;j++){ rec[i][j]=min(mins,rec[j][j]); mins
=rec[i][j]; } } int temp=0; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ //cout<<rec[i][j]<<" "; temp=(j-i+1)*rec[i][j]; if(temp>maxs)maxs=temp; } //cout<<‘\n‘; } cout<<maxs; return 0; }

1.有一個rec矩陣,對角線上表示只有當前矩形自己時的面積

2.從第一個依次往後遍歷,看能達到的最大高度(是有最低高度限制的)

3.然後再雙層循環,註意寬度是j-i+1,而不是j-i,這樣即可計算出寬*高=面積。

CCF 201312-3 最大的矩形[比較簡單]