A 最大矩形單調棧解法 Week5作業)

2021-10-04 03:18:13 字數 2084 閱讀 5225

1、是一道經典的單調棧問題;

2、利用單調棧計算出當前高度的矩形左右兩邊可以延伸到的寬度

·計算出當前矩形左邊第乙個比該矩形高度小的座標

·計算出當前矩形右邊第乙個比該矩形高度小的座標

·兩者之差,是以當前矩形高度為高的最大矩形的寬度

·計算矩形面積,求出最大面積

3、利用乙個單調棧從左往右對矩形高度進行遍歷

·如果當前矩形高度大於棧頂的矩形高度,壓入棧,寬度(座標)加一

·否則,將單調棧中的矩形彈出,並根據彈出矩形高度算當前面積,記錄最大值

(這個題目我遇到了許多從來沒有遇到過得「玄學」問題)改到**,最後才發現居然有這麼多細節沒有注意到。
第一種思路中:
1、term、st、record、recordr等陣列沒有申請全域性變數  ---------wa 或 re

這個問題真的不應該再出現,一定要記住,主函式申請的陣列有空間限制,沒有確定陣列數量一定較小的,都申請全域性變數

2、ans設為int型,導致答案資料溢位 -------wa

沒有看到資料範圍,導致一直發現不了為什麼會wa,下次寫題一定要注意資料範圍

3、long long z = int a*b 依然會導致資料溢位,沒有強制轉換型別-------wa

應該改為long long z=(long long ) a*b(其中a、b為int型)

第二種思路中:
同樣沒有申請全域性變數陣列,導致wa,而且發現這種情況下oj系統輸出和本地跑出的資料是不一樣的!
第一種思路:
#include

#include

#include

#include

using

namespace std;

int term[

1000005];

int st[

1000010

],record[

1000010

],recordr[

1000010];

long

long ans;

intmain()

int st[n+1]

,top=-1

;int index[n+1]

;for

(int i=

1;i<=n+

1;i++

) st[

++top]

=term[i]

; index[top]

=i;}

int str[n+1]

; top=-1

;int indexr[n+1]

;for

(int i=n;i>-1

;i--

) str[

++top]

=term[i]

; indexr[top]

=i;}

ans=0;

for(

int j=

1;j<=n;j++

) cout<

}return0;

}

第二種思路
#include

#include

using

namespace std;

int term[

1000005];

int st[

1000010

],record[

1000010];

long

long ans;

intmain()

else

st[++p]

=term[i]

; record[p]

=w+1;}

} cout<

}return0;

}

WEEK5 周記 作業 單調棧 最大矩形

給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4,5,1,3,3,他們的寬都是1,其中最大的矩形是陰影部分。輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 n 100000.然後接下來n個整數h1,hn,滿足 0 hi 1...

week5 作業A 最大矩形

給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是2,1,4,5,1,3,3,他們的寬都是1,其中最大的矩形是陰影部分。input 輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 n 100000.然後接下來n個整數h1,hn,滿足 ...

Week5 A 最大矩形(單調棧)

給乙個直方圖,求直方圖中的最大矩形的面積。例如,下面這個中直方圖的高度從左到右分別是 2,1,4,5,1,3,3,他們的寬都是1,其中最大的矩形是陰影部分。輸入包含多組資料。每組資料用乙個整數n來表示直方圖中小矩形的個數,你可以假定1 n 100000.然後接下來n個整數h1,hn,滿足 0 hi ...