哇,你這個題目怎麼和我剛剛看到一篇好像哦,沒錯,我也看了前端跳槽面試算法——動態規劃 我這篇算是那篇的補充版吧,補充了一些我本身的想法。前端
首先看一下題目(複製自前端跳槽面試算法——動態規劃):git
有一個只能容納10本書的單層書架,你每次只能放1本或2本書。要求用程序求出你將書架填滿一共有多少種方法。github
好比,每次放1本書,一共放10次,這是其中一種方法。咱們能夠簡寫成 1,1,1,1,1,1,1,1,1,1。面試
再好比,每次放2本書,一共放5次,這是另外一種方法。咱們能夠簡寫成 2,2,2,2,2。算法
這裏我更願意把他抽象成數學題目,即用數字1和數字2組合成一個一維數組,而且和爲10,問有多少種不一樣的組合方式。數組
這裏我認爲【最優子結構】是比較難想的,即F(10)
表明和爲10的組合方案數,F(9)
表明和爲9的組合方案數,我也是看到了他的解析纔想到(做爲一個學過ACM的人,感受本身好菜啊)這以後便能想到F(10) = F(9) + F(8)
。post
其實這裏還能擴展更多,好比:單層書架能夠放100本書,你能夠選擇放2本,4本和6本,請問有多少種組合?其實這類就都應該會了,顯然它的狀態轉移方程是F(n) = F(n-2) + F(n-4) + F(n-6)
最後算出F(100)
便可。code
其實這個我相信你們都學過,由於這就是斐波那契數列的一種變式,而第一個問題就和斐波那契數列如出一轍了有木有,都是F(n)=F(n-1)+F(n-2)
。cdn
再好比:一個樓梯共有50層臺階,你能夠選擇跨1層,跨2層,跨3層的方式經過樓梯,請問經過樓梯共有多少種方案?這個把用數學把問題抽象出來,就和上面是一毛同樣的,就留給你們去思考了。blog
最後我還想討論一下LeetCode 63題的代碼,題目在前端跳槽面試算法——動態規劃這裏,我就不復制了,它是用遞歸來寫的,遞歸會很慢,並且它的時間複雜度也很差計算(好吧,是我不會),其實沒有必要,可使用二維數組來模擬,這裏是代碼 以下圖即是結果,時間複雜度是O(m*n)
,能夠超過98%的用戶。