动态规划法(九)想要更多例子?
??本文將會介紹三個用動態規劃法解決的例子,分別是:
- 樓梯臺階問題
- 二項式系數求解
- 最大乘積子數組問題
樓梯臺階問題
一個n階的樓梯,一個嬰兒每次爬一階或兩階,試問一共有多少種辦法爬完樓梯。設f(n)為該問題的解,考慮最后一次的爬法,若最后一次爬一階,則前面n-1階樓梯有f(n-1)種辦法,若最后一次爬兩階,則前面n-2階樓梯有f(n-2)種辦法,因此:
$$f(n)=f(n-1)+f(n-2).$$
f(1)=1,f(2)=2,f(3)=3,....該數列為斐波那契數列,可以參考博客動態規劃法(一)從斐波那契數列談起用動態規劃法進行求解。
同上面的解法一樣,有:
$$f(n)=f(n-1)+f(n-2)+f(n-3).$$
其中,f(1)=1,f(2)=2,f(3)=4. 可以參考博客動態規劃法(二)找零錢問題用動態規劃法進行求解。
二項式系數求解
??對于二項式系數,有如下等式:
$$C_{n}^{k}=C_{n-1}^{k}+C_{n-1}^{k-1}.$$
再結合$C_{n}^{0}=1,C_{n}^{1}=n$對該問題用動態規劃法進行求解,本質上這也是一個遞歸關系式。Python代碼如下:
最大乘積子數組問題
??所謂的最大乘積子數組問題,指的是:給定一個數組A,尋找A的乘積最大的非空連續子數組。比如,數組 A = [-2, -3, 4], 最大乘積子數組應為A,其和為24。
??在博客動態規劃法(八)最大子數組問題(maximum subarray problem)中,我們已經用動態規劃法解決了最大子數組問題。對于最大乘積子數組問題,我們也可以類似地用動態規劃法解決。但是,對于A中元素均為正數的情形,可以有更簡單的方法。
??首先對A中元素去對數,則原問題等價于最大子數組問題,找出最大和后,再用指數作用,就能得到A中元素均為正數的最大乘積子數組問題的解。其Python代碼如下:
輸出結果為:
[1, 6, 256.0]最大乘積子數組問題的最大乘積為256,子數組開始坐標為1,結束坐標為6,因此子數組為[4, 1/2, 16, 1/8, 32, 2]。
注意:本人現已開通兩個微信公眾號: 用Python做數學(微信號為:python_math)以及輕松學會Python爬蟲(微信號為:easy_web_scrape), 歡迎大家關注哦~~
總結
以上是生活随笔為你收集整理的动态规划法(九)想要更多例子?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 并查集 Python实现
- 下一篇: 今年618我要Pick有很吓人技术GPU