time limit: 1 second
memory limit: 128 mb
有n個矩形,矩形的底邊邊長為1,且均在x軸上,高度給出,第i個矩形的高為h[i],例如h = [3, 2, 4, 2]的圖形如下:
你可以容易地發現,只需要3個矩形就能覆蓋這個圖形。 你的任務就是,輸出最少需要幾個矩形能覆蓋這個圖形。
第一行乙個整數n。接下來1行包含n個正整數,為h[i]。
輸出乙個整數表示最少需要幾個矩形能覆蓋這個圖形。
對於所有資料,n<=100000,h[i] <= 100。 對於部分資料,n<=10; 對於部分資料,n<=100; 對於部分資料,n<=1000; 對於部分資料,h[i] <= 10;
10【題解】2 3 2 4 2 1 3 4 3 2
像是題目給的那張圖
會發現前3列。3 2 4無論如何都沒有辦法用少於3個矩形覆蓋。
而第4列2確可以省掉乙個。
因為我們可以橫著用一條長的把第2列和第3列都覆蓋到
假想一下旁邊還有乙個高度為2的。也同樣可以覆蓋掉。
但如果是這樣卻不能省
雖然1和4高度都為2.
但是你中間有比這兩個2低的1.
這下你可沒辦法弄乙個長長的矩形同時覆蓋它們倆了。
事實上如果後面出現2或者3都沒有可能節省了,因為1比2和3都矮,都和這種情況相似(即雖然前面有一樣高度的但是沒辦法省乙個矩形)。
由此。我們可以用棧來解決這個問題。
如果棧為空就把當前這個高度入棧。
否則。如果當前元素比棧頂元素高。則入棧。
否則一直退棧。直到滿足當前元素比棧頂元素高或恰好等於棧頂元素。
如果恰好等於則不要入棧(表示省了乙個矩形)。
最後統計入過棧的元素的個數。就是答案了。
【**】
#include int n,stack[100009] = ,top = 0,num = 0;void input_data()
}}void output_ans()
int main()
矩形覆蓋問題
問題描述 用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。現在問用8個2 1的小矩形無重疊地覆蓋乙個2 8的大矩形,總共有多少種方法?矩形如下 分析 我們可以把2 8的覆蓋方法記為f 8 用第乙個1 2的矩形去覆蓋大矩形的最左邊時有兩個選擇,豎著放或橫著放。如果豎著放,那麼右邊還剩2 7的矩形區域,這...
58 矩形覆蓋
矩形覆蓋 我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?斐波那契數列 2 n的大矩形,和n個2 1的小矩形 其中target 2為大矩陣的大小 有以下幾種情形 1 target 0 大矩形為 2 0,直接return ...
矩形覆蓋(python)
原始碼 我們可以用2 1的小矩形橫著或者豎著去覆蓋更大的矩形。請問用n個2 1的小矩形無重疊地覆蓋乙個2 n的大矩形,總共有多少種方法?coding utf 8 依舊是斐波那契數列 2 n的大矩形,和n個2 1的小矩形 其中 2 target 為大矩陣的大小 有以下幾種情形 1 target 0 大...