動態規劃算法應用之 切割木棍問題

切割木棍問題

給定一根長度爲 n 英尺的木棍和一個價值數組 value[],數組中的第 i 個元素值 v 代表木棍長長度爲 i 時,其價值爲 v。現在要求將木棍切割成若干段,使得切割後所有木棍的價值總和最大。例如給定長度爲 8 的木棍,對於下圖的價值數組,當把它切割成兩段長度爲 2 和 6 的木棍時,兩木棍的價值總和最大,爲 22。

而對於同樣的長度 8,如果價值數組如下,那麼切割成 8 段長度爲 1 的木棍時取得最大價值 24=3*8。

分析:先考慮只切割一次的情況,因爲切割的位置只有 n 個(包括位置 0,即不切割),在每次切割後會得到兩根木棍,它們的價值是確定的,所以可以比較出在 n 個切割位置中,哪個位置的切割得到的價值最大。切割得到的兩木棍又可以這樣遞歸的切割,每次選擇取得最大價值的位置來切,最後就找到最大價值。所以有如下的切割遞歸公式

cutRod(n) = max(price[i] + cutRod(n-i-1)) for all i in {0, 1 .. n-1}

要注意在遞歸計算的過程中,會有很多重疊的子問題,爲避免重複計算,我們可用一個維表存儲各子問題的解。即我們用了 dp 算法。

如果不用 dp,直接暴力求解上面的遞歸式,則程序如下

C語言實現

#include<stdio.h>
#include<limits.h>
 
// A utility function to get the maximum of two integers
i
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章