u201 矩形覆蓋

2022-05-22 05:06:08 字數 1055 閱讀 6619

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