思路:經過假設法,尋找數據間的關係,進行建模。 數組
假設n=4,窮舉全部的切割方式,找到最佳的切割方案。spa
不切(0刀):最高9元3d
1刀:最高10元blog
2刀:最高7元排序
3刀:最高4元遞歸
觀察數據:(總長爲5米的鋼材最優收益是:2米剛纔最優收益+3米鋼材最優收益加和。)內存
從上述表,咱們能夠得出:對於γn(n>= 1),咱們能夠用更短的鋼條的最優切割收益來描述它:數學
對於每一個i=一、二、...、n-1,方案步驟以下:class
1)將鋼條切割爲長度爲i和n-i的兩段;效率
2)求解這兩段的最優切割收益γi和γn-i。——每種方案的最優收益爲兩段的最優收益之和。
因爲沒法預知那種方案會得到最優收益,咱們必須考察全部可能的i,選取其中收益最大者。
原有方式:
簡化版本:鋼條從左邊切割下長度爲i的一段,對左邊的一段i再也不進行切割,只對右邊剩下的長度爲n-i的一段繼續進行切割(採用了一種自頂向下的遞歸方式)
分析CUT-ROD:實際運行中,你會發現CUT-ROD的效率不好。由於CUT-ROD反覆地用相同的參數值對自身進行遞歸調用,即它反覆求解相同的子問題,以下圖所示:
CUT-ROD的運行時間爲n的指數,時間複雜度以下:
動態規劃方法的核心思想是:對每一個子問題只求解一次,並將結果保存下來。若是隨後再次須要此子問題的解,只需查找保存的結果,而沒必要從新計算。所以,動態規劃方法是付出額外的內存空間來節省計算時間,是典型的時空權衡的例子。
方法1:帶備忘的自頂向下法。此方法扔按天然的遞歸形式編寫,但過程會保存每一個子問題的解(一般保存在數組或散列中)。當須要一個子問題解時,過程首先檢查是否已保存過此解,無則計算,有則返回。
方法2:自底向上法。將子問題按規模排序,按由小至大順序求解。當求解某個子問題時,它所依賴的那些更小的子問題都已求解完畢,結果已保存。每一個子問題只需求解一次,當咱們求解它時,它的全部前提子問題都已經求解完成。
當思考一個動態規劃問題時,咱們應該弄清所涉及的子問題及子問題之間的依賴關係。
上面舉得n=4時,鋼條切割問題的子問題圖以下:這是遞歸調用樹的簡化版,樹中標號相同的節點收縮爲圖中的單一頂點,全部邊均從父節點指向子節點。
上面的圖中,咱們能夠把每一個頂點向量化,標記爲(x,y)。這個表示求解x的問題時候,咱們須要子問題y的解。