动态规划是一种用来找到问题最优化解决方案的策略,能用动态规划解决的问题一般需要具有“层叠子结构”。
基本思想
动态规划的基本步骤如下:
- 将原问题分解为多个子问题。
- 找到子问题的解。(最优解)
- 用子问题的解构造原问题的解。
由上可以看出,使用动态规划要求问题具有最优子结构,即初始问题的最优解可以通过子问题的最优解分步实现。
对于第三步有两种方法实现:
- 自顶向下(Top-down):采用递归形式实现。使用该方法需要采用额外变量来存储已经解决的子问题结果,来避免递归产生的重复计算问题。天然具有获得产生最优解步骤的能力。
- 自底向上(Bottom-up):采用迭代形式,将所有计算问题可能用到子问题的解都计算出来,然后用他们构造源问题的解。使用该方法需要用额外变量来存储产生最优解的步骤。天然具有消除重复计算的能力。
实现关键
能否用动态规划解决问题,关键一步就是能否构造出求解的子问题空间。对子问题空间的一般要求是:原问题是子问题将问题域进行扩大后的一个特例,子问题在迭代的第一步有自然解,解决大问题域的问题可以而且应该用到已解决的小问题域的解
难点主要有两方面:1.状态转移方程的建立,如何找到最优子结构,构造出状态转移方程(最大子序列和问题)
2.状态的确立,如何最优的确立状态,在满足无后效性的情况下最大可能的使子问题重叠率变大,已达到效率的优化。(青蛙荷叶问题)
实现策略
1.将问题域的增大设计成由一个或几个变量线性增长实现的,即将问题域用几个线性增长的变量表示。
应用举例
找零钱,0-1背包问题都是动态规划的经典应用。