動態規劃

動態規劃是一種分階段求解決策問題的數學思想,即“大事化小,小事化了”。

比如走樓梯問題,一個樓梯有10級,每次只能走一級或兩級,問:共有多少種走法?

如果最後到第10級,那麼最後一步就是由8-10或者9-10,設由0-8共X種走法,0-9共Y種走法,那麼0-10走法=X+Y,即F(10)=F(9)+F(8)

依次類推,F(9)=F(8)+F(7)...

當只有1級臺階和兩階臺階時,分別是1或2種走法。

由此,可以歸納出:

F(1)=1
F(2)=2
F(n)=F(n-1)+F(n-2) n>=3

動態規劃中包含三個重要概念:最優子結構、邊界、狀態轉移公式。

以上,F(9)和F(8)是F(10)的最優子結構。

當只有1級或2級臺階時,可以直接得出結果,不需要繼續簡化。稱F(1)和F(2)是問題的邊界。如果一個問題沒有邊界,將永遠無法得到有限結果。

F(n)=F(n-1)+F(n-2)是階段與階段間的狀態轉移方程。這也是動態規劃的核心,決定了問題的每一階段和下一階段的關係。

以上只是建模

對於求解,如果直接拿模型來解:

這是一棵二叉樹,時間複雜度近似地看作是o(2^N)

之所以時間複雜度如此大,因爲有些相同的參數被重複計算了

如何解決呢?用緩存,先創建一個哈希表,每次將不同的參數的計算結果存進去。後面當遇到相同參數時,從中取出,就不用重複計算。這種暫存計算結果的方式叫“備忘錄算法”。此時時間複雜度是o(N),空間複雜度也是o(N)。

如何再一步優化?

我們是否一定需要對F(N)自頂向下做遞歸運算嗎?可不可以自底向上,用迭代方式推導出結果?

例如當臺階是4時,走法數量是5,由F(2)+F(3)所得,即F(4)只依賴於F(2)和F(3)

即每一次迭代過程中,只需要保留之前兩個狀態,就可以推導出新的轉態,大大節省了空間。這就是動態規劃。

但動態規劃的本質不在於是遞推或是遞歸,即動態規劃中遞推式的求解方法不是動態規劃的本質,也不需要糾結是不是內存換時間。

動態規劃的本質,是對問題狀態的定義和狀態轉移方程的定義。

動態規劃是通過拆分問題,定義問題狀態和狀態之間的關係,使得問題能夠以遞推(或者說分治)的方式去解決。如何拆分問題,纔是動態規劃的核心。而拆分問題,靠的就是狀態的定義和狀態轉移方程的定義。

參考資料:
1.漫畫:什麼是動態規劃?
2.什麼是動態規劃?動態規劃的意義是什麼?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章