哇,你这个题目怎么和我刚刚看到一篇好像哦,没错,我也看了前端跳槽面试算法——动态规划 我这篇算是那篇的补充版吧,补充了一些我本身的想法。前端
首先看一下题目(复制自前端跳槽面试算法——动态规划):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%的用户。