【算法浅析NO.00007】动态规划算法浅析 by arttnba3
本文首发地址:arttnba3.cn
0x00.绪论
动态规划(Dynamic Programming)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。同时也是各类信息学竞赛( Olympiad in Informatics )中较为常用的算法之一。
作为前·蒟蒻·OIer,对动态规划也是稍微了解一点点的XD,所以今天来简单地讲讲这个算法XD就当复习了
注:你一定想不到这篇文章拖了4个月才开始动笔2333333
0x01.什么是动态规划算法?
定义
动态规划(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。
动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。
通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。
简单而言:
动态规划便是通过寻找出一个问题的重叠子问题/最优子结构来优化对问题的求解,将问题进行分阶段求解,并确保当前阶段是过于所有阶段的完美总结。
适用于求解具有如下性质的问题
- 最优子结构: 无论其初始状态及初始决策如何,其以后诸决策对以第一个决策所形成的状态作为初始状态的过程而言,永远构成最优策略。这个原理的实质是多阶段决策过程具有这样的性质,即不管过去的过程如何,只从当前的状态和系统的最优化要求出发,作出下一步的最优决策 。
- 无后效性: 将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态。换句话说,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性
- 子问题重叠: 动态规划算法的关键在于解决冗余,这是动态规划算法的根本目的。动态规划实质上是一种以空间换时间的技术,它在实现的过程中,不得不存储产生过程中的各种状态,所以它的空间复杂度要大于其他的算法。选择动态规划算法是因为动态规划算法在空间上可以承受,而搜索算法在时间上却无法承受,所以我们舍空间而取时间
如下图所示便是一个简单的动态规划算法的应用过程