算法与编程:怎样迈台阶——动态规划算法

Posted 白珍名师工作室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法与编程:怎样迈台阶——动态规划算法相关的知识,希望对你有一定的参考价值。

展现独立思想  博采百家众长

汇集涓涓细流  共向辽阔海洋

 


(本文摘自网络,作者为“梦见”)


算法与编程:怎样迈台阶——动态规划算法(二)

小白同学和大黄老师


 在中,小白同学用递归算法编写了程序,大黄老师认为在空间复杂度还可以优化。

 

大黄老师:当遇到困难时,最有效的解决办法就是逆转思路。想一想,我们一定要对F(n)自顶向下做递归运算吗?能不能反过来,自底向上进行,用迭代的方式推导结果?

 

小白同学:怎么做呢?

 

大黄老师:我通过一张表格,来说明自底向上求解的过程。表格的第一行代表楼梯台阶的数目,第二行代表若干级台阶对应的走法数量,F(1)=1,F(2)=2,这是已知结论。 

算法与编程:怎样迈台阶——动态规划算法(二)


第一次迭代,台阶数等于3时,走法数量是3,这是由F(2)和F(1)相加得出的,所以F(3)只依赖于F(1)和F(2)。 算法与编程:怎样迈台阶——动态规划算法(二)

 

第二次迭代,台阶数等于4时,走法数量是5,这是由F(3)和F(2)相加得到的,所以F(4)只依赖于F(3)和F(2)。 

算法与编程:怎样迈台阶——动态规划算法(二)

 

同理,在后续的迭代中,F(5)只依赖于F(4)和F(3),F(6)只依赖于F(5)和F(4)……

 

由此可见,每一次迭代过程中,只要保留前两个状态,就可以推导出新的状态,而不需要像备忘录算法那样保留全部的子状态。

 

这才是真正的动态规划实现,现在,你根据这个思路写出代码吧。

 

小白同学:好的。

 

方法三:动态规划求解 

算法与编程:怎样迈台阶——动态规划算法(二)

 

程序从 i=3 开始迭代,一直到 i=n 结束。每一次迭代,都会计算出多一级台阶的走法数量。迭代过程中只需保留两个临时变量a和b,分别代表上一次和上上次迭代的结果。为了便于理解,程序引入了temp变量。temp代表当前迭代的结果值。

 

大黄老师:现在计算一下这个方法的时间复杂度和空间复杂度。

 

小白同学:时间复杂度显然是O(n),由于只引入了两个或三个变量,所以空间复杂度应该是O(1),这个程序的效率真高。

 

大黄老师:是的。这就是动态规划,利用简洁的自底向上的递推方法,实现了时间和空间的优化。

 

不过,这道上楼梯的题目只是动态规划领域最最简单的问题,因为它只有一个变化维度,实际生活中的问题要复杂得多。比如下面这个题目,你可以试着解一下。

 

题目:国王和金矿

有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同。参与挖矿工人的总数是10人。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿?

算法与编程:怎样迈台阶——动态规划算法(二)



欢迎关注白珍名师工作室




以上是关于算法与编程:怎样迈台阶——动态规划算法的主要内容,如果未能解决你的问题,请参考以下文章

程序员算法基础——动态规划

动态规划算法例题

算法整理之动态规划

漫画算法003:什么是动态规划?

C/C++ 动态规划 算法

C/C++ 动态规划 算法