13.最为经典的动态规划入门

一、动态规划的简介

动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。
动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。
通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。

首先,动态规划和递推有些相似(尤其是线性动规),但是不同于递推的是:
递推求出的是数据,所以只是针对数据进行操作;而动态规划求出的是最优状态,所以必然也是针对状态的操作,而状态自然可以出现在最优解中,也可以不出现——这便是决策的特性(布尔性)。其次,由于每个状态均可以由之前的状态演变形成,所以动态规划有可推导性,但同时,动态规划也有无后效性,即每个当前状态会且仅会决策出下一状态,而不直接对未来的所有状态负责,可以浅显的理解为——Future never has to do with past time ,but present does.
现在决定未来,未来与过去无关。

二、动态规划大致试用的场合

在这里插入图片描述

三、列举一个实例

在这里插入图片描述
以上问题便是求解动态规划中较为经典的求最大最小值的问题

四、解决动态规划问题的三个步骤

1.动态规划的组成部分一:确定状态

  • 状态在动态规划中的作用相当于定海神针
  • 简单而言,就是解决动态规划问题需要开辟一个数组,数组可以是一维、二维或者多维(f[i] , f[i][j])
  • 确定状态需要两个意识:
  • 最后一步:
    在这里插入图片描述
    关键点一:我们不关心前面的K-1枚硬币是怎么拼接出来27-ak的(可能有一种,也有可能有多种),而且我们甚至并不清楚ak和K,但是我们确定前面的硬币能够拼出27-ak

关键点二:因为是最优策略,所以拼出27-k的硬币数一定要最少,否则这就不是最优策略了

  • 子问题:
    在这里插入图片描述
    在这里插入图片描述
    注意:有些时候我们会问到这个问题为什么不可以用递归来求解,下面我们来分析一下递归代码的缺陷
    在这里插入图片描述
    使用递归写法的结果分析图如下:会重复计算很多子节点,而且当参数比较大的时候,递归的解法的时间复杂度是非常大的,所以这道题不可以使用递归来解答。
    在这里插入图片描述
    注意:那么我们怎么改变递归这种弊端呢?使用动态规划,将每一次的计算结果保存下来,并改变计算顺序。

2.动态规划组成部分二:转移方程
在这里插入图片描述

3.动态规划组成部分三:初试条件和边界情况
在这里插入图片描述

4.动态规划组成部分四:计算顺序
在这里插入图片描述
解决这道题为什么使用动态规划比较好呢?

  • 每一步只尝试三种硬币,一共27步
  • 与递归算法相比,没有任何重复计算
  • 时间复杂度(即需要进行的步数):27 * 3 (即是O(n)的时间复杂度)

5.动态规划小结在这里插入图片描述

五、上述问题的代码实现

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值