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 ...