动态规划总结

本文深入探讨了动态规划算法,这是一种解决多阶段决策过程最优化问题的有效方法。动态规划通过分解问题并存储子问题的解来提高效率,特别适用于具有子问题重叠性、最优化原理和无后效性的场景。文章介绍了动态规划的必要条件、设计步骤,并通过一个具体的LeetCode问题为例,详细阐述了如何应用动态规划来找到最小的调换次数,使得两个序列严格递增。此外,文章还分享了作者在学习动态规划过程中的心得体验,并推荐了一些相关的学习资源。
摘要由CSDN通过智能技术生成

生活中我们经常能够碰到这样一类问题,它的过程可以按照时间顺序分成若干个相互联系的子阶段。每一个子阶段都可以得出一个结论,学术上我们称之为决策,则这一整个过程的决策就是这些子阶段的决策的总和,即决策序列。这种过程称为多阶段决策过程。

针对这种多阶段决策过程,本文提到一种算法对于解决该类问题非常适用,即动态规划算法。动态规划(Dynamic Programming)算法是解决多阶段决策过程最优化问题的一种常用方法,难度比较大,技巧性也很强。利用动态规划算法解决此类问题,可以减少很多无谓的计算量。

动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它进行求解,并把答案保存起来,以后再次遇到时直接引用答案,不必重新求解。动态规划算法将问题的解决方案视为一系列决策的结果。另外,在动态规划算法中,还要考察每个最优决策序列中是否包含一个最优决策子序列,即问题是否具有最优子结构性质。

必要条件

一般来说,在判定一个问题是否需要采用动态规划方法求解时,我们需要观察分析该问题是否满足以下几个条件:

(1)动态规划的子问题重叠性质:

         这里所说的子问题是指整个过程中的子阶段:假设某n个成员的不规则数据序列中,需要找出该序列中一个递增子序列的最大成员个数。例如给定5个数据分别为2、6、3、9、8,由于该问题比较容易解答,我们在此通过表格的形式来展示各个阶段的最优解。下图中第一行代表的是数据的个数,第二行为给定的数据,第三行在个数为n时的最优解,当有5个数据的时候,此时的递增成员变量的最大个数为3个(S(5))。而图中用椭圆形圈住的即该系统的子系统,也就是我们标题中所说的子问题。

 

从图中可以看出,我们如果要向计算棕色圈住的即5个数据的系统中的最优解,我们其实可以先将深蓝色的即4个数据的最优解求出,然后使用该最优解中的最大数据与第5个数据进行比较,从而决定第5个数据是否也能放在最大递增子序列中;而如果要求解深蓝色系统的最优解,我们可以先将绿色系统的最优解求出,而绿色系统又是深蓝色系统的子系统。由此可见,该系统中的最优解可以由其子系统中的最优解间接求出。

         子问题的重叠性描述的是在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下上一次计算的结果,因此相较于简单的利用递归处理的要有更高的效率。本文认为子问题重叠是动态规划使用的基础,如果子问题之间没有相关联系,动态规划处理也就不适合使用。

(2)动态规划的最优化原理:

动态规划解决问题的思路一般就是求解问题的最优解,当问题呈现出子问题重叠性之后,问题的最优解即可以理解为求解子问题的局部最优解。所有子问题的最优解会导致整个问题的全局最优,因此称该问题具有最优子结构的性质,也就是说一个问题的最优解只取决于其子问题的最优解,而非最优解对问题的求解没有影响。

(3)动态规划的无后效性原则:

 所谓无后效性原则,指的是这样一种性质:某阶段的状态一旦确定,则此后过程的演变不再受此前各状态及决策的影响。也就是说,“未来与过去无关”,当前的状态是此前历史的一个完整的总结。

设计步骤

当我们已经确定待解决的问题需要用动态规划算法求解时,通常可以按照以下步骤设计动态规划算法:

1、分析问题的最优解;

2、递归地定义最优值;

3、采用自底向上的方式计算问题的最优值;

4、根据计算最优值时得到的信息,构造最优解。

1~3步是动态规划算法解决问题的基本步骤,在只需要计算最优值的问题中,完成这三个基本步骤就可以了。如果问题需要构造最优解,还要执行第4步;此处的最优解是对最优值的一个通用表达,可以表达该系统内任意子问题的最优值。因此在第3步通常需要记录更多的信息,以便在步骤4中,有足够的信息快速地构造出最优解。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值