日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

CCF 最大的矩形

發(fā)布時間:2023/10/11 综合教程 98 老码农
生活随笔 收集整理的這篇文章主要介紹了 CCF 最大的矩形 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

問題描述

試題編號: 3
試題名稱: 最大的矩形
時間限制: 1.0s
內(nèi)存限制: 256.0MB
問題描述:
問題描述

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

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

輸入格式

第一行包含一個整數(shù)n,即矩形的數(shù)量(1 ≤ n ≤ 1000)。

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

輸出格式
輸出一行,包含一個整數(shù),即給定直方圖內(nèi)的最大矩形的面積。
樣例輸入

6

3 1 6 5 2 3

樣例輸出
10

之前用O(n^2)寫的沒有得滿分,學(xué)了下O(n)的做法。

題意找出最大面積的長方形。

之前做過類似的題,有O(n)復(fù)雜度的做法,用棧維護一個遞增的序列,棧中存對應(yīng)高度的位置。

每遍歷一個元素,判斷是否是棧中最大的元素,如果不是,把棧頂?shù)脑貜棾觯⒂嬎阋詶m斣貫樽畲笾蹈叨葧r的長方形面積。

面積的長度為棧頂元素之前的一個元素到當(dāng)前遍歷的元素的之間的長度,邊界情況特殊考慮。

注意彈棧是每一次都要判斷,比如34555下標01234,如果有等號的時候到3,2彈棧,但是1,0不彈棧。

#include <cstdio>
#include <iostream>
#include <stack>
#include <cstring>
using namespace std;
stack<int> s;
int main()
{
int n,data[];
while(scanf("%d",&n)!=EOF)
{
memset(data,,sizeof(data));
for(int i=;i<n;i++)
scanf("%d",&data[i]);
int mx=;
for(int i=;i<n;i++)
{
if(s.empty()) s.push(i);
else
{
while(!s.empty()&&data[i]<data[s.top()])
//注意彈棧是每一次都要判斷,
//比如34555下標01234,如果有等號的時候到3,2彈棧,但是1,0不彈棧。
//有沒有等號都對
//序列時刻是遞增的
{
int ph=s.top();
s.pop();//必須先彈棧
//i-s.top()-1表示>=ph的元素的個數(shù)
if(!s.empty())
mx=max(mx,(i-s.top()-)*data[ph]);
else
mx=max(mx,i*data[ph]);
}
s.push(i);
}
}
while(!s.empty())
{
int ph=s.top();
s.pop();
if(!s.empty())
mx=max(mx,(n-s.top()-)*data[ph]);
else
mx=max(mx,n*data[ph]);
}
printf("%d\n",mx);
}
return ;
}

拓展問題是求01矩陣的最大子矩陣。

附上鏈接:傳送門

總結(jié)

以上是生活随笔為你收集整理的CCF 最大的矩形的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。