动态规划
适用动态规划解决的问题,经分解得到的子问题往往不是互相独立的,通过把原问题分解为相对简单的子问题的的方式求解复杂问题的方法,求解的问题要具备最优子结构性质和重叠子问题性质的基本要素。
基本思想:
如果给定一个问题,我们可以分解为不同的子问题且能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,从而得到多项式时间算法。为了达到此目的,可以用一个表来记录所有已解决的子问题的答案。不管该问题以后是否被用到,只要它被计算过,就将其结果填入表中。
使用动态规划算法我们需要额外开辟一段内存空间(表),来保存中间计算的结果,可以看成是以空间换时间的典型算法。
动态规划算法使用于解最优化问题(最大值或最小值),一般步骤归纳为:
- 找出最优解的性质,并刻画其结构特征。
- 递归地定义最优值。
- 以自底向上的方式计算出最优值,
- 根据计算最优值时得到的信息,构造最优值。
最优子结构性质
含义:该问题的最优解包含分解的子问题的最优解,可以对此性质进行证明。也可以描述为最优解即最优解状态,我们要通过最优子结构性质已知的该问题最优解状态找到子问题最优解的状态转移函数,最后由子问题的最优解与边界来求解。
利用此性质的主要作用是获取状态转移函数。
重叠子问题性质
含义:在用递归自底向上解决问题时,每次产生的子问题并不都是新问题,有些子问题被反复计算多次,动态规划算法正是利用了子问题重叠性质,对每个子问题只解一次,而后将其解保存在一个表格中,在以后尽可能多地利用这些子问题的解。由该问题分解的众多子问题中要存在重复,这样才能使程序在多项式的时间内的运行完毕,提高效率。
利用此性质的主要作用是提供一个表格存储中间计算结果,避免重复计算。
下面是一