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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

动态规划-直方图最大长方形

發(fā)布時(shí)間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 动态规划-直方图最大长方形 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
/* 1017: C03-單調(diào)棧算法-最大長方形
時(shí)間限制: 1 Sec 內(nèi)存限制: 128 MB 提交: 17 解決: 10 [提交] [狀態(tài)] [討論版] [命題人:外部導(dǎo)入] 題目描述給你一個(gè)直方圖,告訴你各個(gè)條形矩形的高度,求基線對(duì)齊構(gòu)成的矩形中面積最大的矩形的面積。對(duì)于每一個(gè)矩形,面積 = h[i]*(j-k+1),其中j,k是左右邊界,h[i]是矩形的高。并且對(duì)于j <= x <= k,h[i] <= h[x]。代碼提交鏈接輸入 輸入包含幾個(gè)測試用例。每個(gè)測試用例描述一個(gè)直方圖,并以整數(shù)n開始,表示它由多少個(gè)矩形組成。你可以假設(shè)1 <= n <= 100000。然后按照n個(gè)整數(shù)h1,…, hn,其中0 <= hi <= 1000000000。這些數(shù)字表示直方圖中從左到右排列的矩形的高度。每個(gè)矩形的寬度是1。0緊跟最后一個(gè)測試用例的輸入。輸出 對(duì)于單個(gè)行上的每個(gè)測試用例輸出,指定直方圖中最大矩形的面積。記住,這個(gè)矩形必須與公共基線對(duì)齊。樣例輸入7 2 1 4 5 1 3 3 4 1000 1000 1000 1000 0樣例輸出8 4000提示我們可以用一個(gè)單調(diào)棧由低到高來存儲(chǔ)它的高度,并用數(shù)組對(duì)每個(gè)高度記錄一下它前面(包括它自己)一共有多少個(gè)比它高的,可以看做它的左寬。 按順序考慮每個(gè)高度h,如果h大于棧頂元素,則入棧,此時(shí)它大于左面全部的元素,并且將它的寬度初始為1。 否則,將棧內(nèi)元素出棧,直到滿足上面的條件。出棧時(shí),我們要將出棧元素對(duì)之后問題的影響全部考慮進(jìn)行處理,才能保證做法的正確性。 對(duì)于每個(gè)高度,它的作用無非兩個(gè):1、以自己作高,向外擴(kuò)展 2、以別人作高,自己被擴(kuò)展 由于我們數(shù)組中已經(jīng)記錄了某個(gè)高度的左寬,所以我們只需要考慮它能不能向右擴(kuò)展,如果能,能擴(kuò)展多少? 首先,對(duì)于第一個(gè)出棧的元素來說,它的右寬一定是0。 然而對(duì)于第二個(gè),它的右邊有剛才出棧的元素,而且剛才出棧元素的總寬中所涉及的元素一定可以被自己擴(kuò)展,所以自己的右寬為剛才出棧元素的總寬。 同理可知,第三個(gè)出棧元素的右寬為第二個(gè)出棧元素的總寬。依次類推。 而當(dāng)h大于棧頂元素時(shí),h的左寬應(yīng)該是上次出棧元素的總寬+1(自己),然后入棧。 最后時(shí),將所有元素出棧,即可將所有情況考慮。來源/分類 C03-棧 [提交] [狀態(tài)]
*/ #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<string> #include<cstring> #include<stack> using namespace std; const int Max_N=100008; struct Elem{int id;//向左擴(kuò)展最遠(yuǎn)的下標(biāo) long long height;//當(dāng)前節(jié)點(diǎn)高度 Elem(){} //在其他的地方要定義一個(gè)Elem類型的變量的時(shí)候一定要加 Elem(int _id,long long _height):id(_id),height(_height){} }; int N; long long x[Max_N]; long long Ans(){int i,L_id;long long ans=0;Elem e;stack<Elem> stk;for(i=0;i<=N;i++){L_id=i;while(!stk.empty()&&stk.top().height>x[i]){ans=max(ans,(long long)(i-stk.top().id)*stk.top().height);L_id=stk.top().id;stk.pop();}//由于上面修改了L_id,這里相當(dāng)于每次加入一個(gè)長度為(i-L_id)的長方形//這里枚舉一遍找一個(gè)最大值就可以了 stk.push(Elem(L_id,x[i]));}return ans; }int main() {int i;while(cin>>N&&N){for(int i=0;i<N;i++)scanf("%lld",&x[i]);x[N]=-1;cout<<Ans()<<endl;}return 0; }/**************************************************************Problem: 1105User: BlingoLanguage: C++Result: 正確Time:36 msMemory:2880 kb ****************************************************************/

?

1105: B10-動(dòng)態(tài)規(guī)劃:直方圖最大長方形

時(shí)間限制: 1 Sec??內(nèi)存限制: 128 MB
提交: 8??解決: 5
[提交] [狀態(tài)] [討論版] [命題人:外部導(dǎo)入]

題目描述

給你一個(gè)直方圖,告訴你各個(gè)條形矩形的高度,求基線對(duì)齊構(gòu)成的矩形中面積最大的矩形的面積。對(duì)于每一個(gè)矩形,面積 = h[i]*(j-k+1),其中j,k是左右邊界,h[i]是矩形

的高。并且對(duì)于j <= x <= k,h[i] <= h[x]。



?

輸入

輸入包含幾個(gè)測試用例。每個(gè)測試用例描述一個(gè)直方圖,并以整數(shù)n開始,表示它由多少個(gè)矩形組成。你可以假設(shè)1 <= n <= 100000。然后按照n個(gè)整數(shù)h1,…, hn,其中0 <= hi <= 1000000000。這些數(shù)字表示直方圖中從左到右排列的矩形的高度。每個(gè)矩形的寬度是1。0緊跟最后一個(gè)測試用例的輸入。

?

輸出

對(duì)于單個(gè)行上的每個(gè)測試用例輸出,指定直方圖中最大矩形的面積。記住,這個(gè)矩形必須與公共基線對(duì)齊。

?

樣例輸入

7 2 1 4 5 1 3 3 4 1000 1000 1000 1000 0

?

樣例輸出

8 4000

?

提示


我們可以用一個(gè)單調(diào)棧由低到高來存儲(chǔ)它的高度,并用數(shù)組對(duì)每個(gè)高度記錄一下它前面(包括它自己)一共有多少個(gè)比它高的,可以看做它的左寬。
按順序考慮每個(gè)高度h,如果h大于棧頂元素,則入棧,此時(shí)它大于左面全部的元素,并且將它的寬度初始為1。
否則,將棧內(nèi)元素出棧,直到滿足上面的條件。出棧時(shí),我們要將出棧元素對(duì)之后問題的影響全部考慮進(jìn)行處理,才能保證做法的正確性。
對(duì)于每個(gè)高度,它的作用無非兩個(gè):1、以自己作高,向外擴(kuò)展? ? ? ? 2、以別人作高,自己被擴(kuò)展
由于我們數(shù)組中已經(jīng)記錄了某個(gè)高度的左寬,所以我們只需要考慮它能不能向右擴(kuò)展,如果能,能擴(kuò)展多少?
首先,對(duì)于第一個(gè)出棧的元素來說,它的右寬一定是0。
然而對(duì)于第二個(gè),它的右邊有剛才出棧的元素,而且剛才出棧元素的總寬中所涉及的元素一定可以被自己擴(kuò)展,所以自己的右寬為剛才出棧元素的總寬。
同理可知,第三個(gè)出棧元素的右寬為第二個(gè)出棧元素的總寬。依次類推。
而當(dāng)h大于棧頂元素時(shí),h的左寬應(yīng)該是上次出棧元素的總寬+1(自己),然后入棧。
最后時(shí),將所有元素出棧,即可將所有情況考慮。


?

來源/分類

B10-動(dòng)態(tài)規(guī)劃?

?

[提交] [狀態(tài)]

轉(zhuǎn)載于:https://www.cnblogs.com/Tidoblogs/p/11173398.html

總結(jié)

以上是生活随笔為你收集整理的动态规划-直方图最大长方形的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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