重新開始戰鬥05 程式設計之美 光影切割

2021-06-21 02:35:50 字數 1487 閱讀 5710

問題描述:

假設有乙個矩形區域,有若干條直線切割該區域,並且沒有一條直線與y軸平行,且不存在三條(以及3條以上)切割線相交於一點的情況。請問該矩形平面被分割成多少塊。

分析:假設一塊矩形區域已經被切割成很多塊,那麼此時再增加一條切割線,新的切割線與其他切割線相交,且有m個交點。那麼新的切割線被分割成m+1段,每一段都會將原來的一塊子區域分成兩塊,即總的會增加m+1塊新區域。

那麼假設k-1條切割線已劃分了nk-1塊區域,第k條切割線與其他切割線有mk個交點,那麼總的塊數為nk = nk-1+mk+1。

這個公式顯然是個動態規劃問題。(思想是動態規劃,自頂向下的推導)。

顯然,如果利用動態規劃,需要雙迴圈,且還要去查詢交點並判斷交點是否在矩形區域內,那麼時間複雜度為o(n

2|find&judge|)。

下面我畫個程式流程圖:

舉例說明:

1.假設有兩條相交的切割線(交點在矩形區域內)

a.遍歷第一條切割線與剩下的一條切割線是否有相交且在矩形區域內。

存在:sumblock =0+1+1 = 2

b.遍歷第二條切割線與剩下的0條切割線是否有交點

不存在:sumblock =2+0+1 = 3

c.已遍歷完所有的切割線

sumblock = 3 + 1 = 4

2.假設有三條相交的切割線(交點在矩形區域內)

a.遍歷第一條切割線與剩下的兩條切割線的交點

存在兩個交點:sumblock= 0+2+1 = 3

b.遍歷第二條切割線與剩下的一條切割線的交點

存在乙個交點:sumblock= 3+1+1 = 5

c.遍歷最後一條切割線

不存在交點:sumblock= 5+0+1 = 6

d.遍歷完成

sumblock = 6+1 = 7

3.假設有三條相交的切割線(有兩條平行)

a.遍歷第一條切割線與剩下兩條的交點:

存在兩個:sumblock= 0+2+1 = 3

不存在:sumblock =3+0+1 = 4

c.遍歷最後一條

不存在:sumblock =4+0+1 = 5

d.遍歷完成

sumblock = 5+1 = 6

以上解題思路屬於標準的動態規劃,因此我做了詳細的說明。書中還有一種巧妙的技巧性解法,很巧妙的同時也很簡單,只是很難想到罷了。不難看懂,有興趣的話可以再仔細研究一下:原文p51

重新開始戰鬥03 程式設計之美 買書問題

問題描述 由於 哈利波特 系列相當暢銷,店長決定通過 活動來回饋讀者。上櫃的 哈利波特 瓶裝本系列中,一共有5卷。假設每一捲單獨銷售均需8歐元。如果讀者一次購買不同的兩卷,就可以扣除5 的費用,三卷更多。具體的折扣如下 本數 折扣 2 5 3 10 4 20 5 25 每本書只能享受一種折扣。例如買...

重新開始戰鬥04 程式設計之美 尋找ID問題

問題描述 乙個很大的列表 有10億多個數 這個列表中全是都是id號,正常狀態下每個id都會再列表中出現兩次 都是亂序 1.當有乙個id號丟失時,如何找到這個id號 2.當有兩個id號丟失時,如何找到這兩個id號。解法一 最直觀 申請乙個陣列,這個陣列和id列表一樣大,然後遍歷id列表,每遍歷乙個id...

重新開始戰鬥06 程式設計之美 電梯排程問題

問題描述 一座不高的樓裡有一部電梯,為了解決電梯擁擠的問題,電梯的設計者規定每次電梯從一層往上走時,只允許電梯停在其中的某一層。所有的乘客都從一樓上電梯,到達某層樓後,電梯停下來,所有乘客再從這裡爬樓梯道自己的目的層。在一樓的時候,每個乘客選擇自己的目的層,電梯則自動計算出應停的樓層。學模型 設fl...