今天来说说动态规划

Posted 醉月琼筵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了今天来说说动态规划相关的知识,希望对你有一定的参考价值。

    今天做leetcode的每日一题的时候,遇到了困难

    本着贪婪解全部的思想,数组排序后从高到低遍历,即让面额最高硬币的数量最大,但是提交时遇到了问题

今天来说说动态规划

今天来说说动态规划

    从大的方面看,贪婪算法只考虑了眼前的结果,鼠目寸光,在这种问题中,并不适用。还有一种方法,暴力枚举的得到所有可能的硬币组合,最后获得最少硬币数的解,但是这种方法,时间空间复杂度都较高,并不适用。

    这时就要引入动态规划了。

今天来说说动态规划


这是百度百科的说法,我的理解就是,它每一次选择,都会从当前状态和整个系统的最优要求出发,做出下一步的最优解(怎么感觉跟我的贪婪差不多)。


    回到硬币,假如硬币面额是1,5,8需要的钱是10元,利用贪婪算法,得到的结果是8,1,1数量为3,但是凑10元只需要两个5元。这样看,如果我们取了8元,10-8=2,接下来我们需要求出结果为2元的最小硬币数,如果我们取了5元,接下来我们要得到结果为五元的最小硬币数。

    1. 取了8元 结果为 x(2) + 1  =>1*1 + 1*1 +1*8 =10

    2. 取了5元 结果为 x(5) + 1  =>1*5 + 1*5 =10

    3. 取了1元 结果为 x(9) + 1  =>取了5元 结果为 x(4)+1 +1  =>1*4 +1*5 +1*1 = 15

x(n)为获得金额为n的最小硬币数。

    得到一个公式 x(n) = {x(n-1),x(n-5),x(n-8)}min +1

    可以利用debug解析观察数组变化


时间复杂度为O(Sn) S为金额,n为面额数,一共计算O(S)个金额对应硬币数,每一硬币数要遍历所有面额数。

空间复杂度为O(S),数组开了长度为S的空间。

其他解法可取leetcode上看。


Dynamic Programming单词单个翻译就是动态的程序设计,我感觉,它的动态体现在了一种拆分思想,总的等于小的,小的下面还有小的。在DP中还有几个概念,无后效性,这个选择之后的选择和之前的选择没有关联,没有影响。还有个量优子结构,这就是拆分思想,大问题的最优解可以由小问题的最优解推出。

    动态规划今天就说到这,只是刚入了门,理解了概念,还有很多应用例如最短路径,二分查找树。以后遇到再谈。

    欢迎各位大佬批评。


以上是关于今天来说说动态规划的主要内容,如果未能解决你的问题,请参考以下文章

面试官:换人!他连动态规划的一个模型三个特征都不懂

什么样的问题应该使用动态规划?

动态规划概述:递归——伟大思维闪耀时

动态规划-自底向上的 0-1 背包问题

简说动态代理

动态规划入门看这篇就够了,万字长文!