动态规划是算法中的难点与重点,面试的时候应该也会经常遇到。动态规划是运筹学的一个分支,是求解决策过程最优化的教学问题,其处理对象是多阶段决策问题。这种问题一般可以分解成为若干个相互联系的阶段,在每一个阶段都要做出决策,形成一个决策序列,该决策序列也成为一个策略。对于每一个决策序列,可以在满足问题的约束条件下用一个数值函数(即目标函数)衡量该策略的优劣。多阶段决策问题的最优化目标是获取导致问题最优值的最优决策序列,即得到最优解。
最优性原理
假设为了解决某一多阶段决策过程中的优化问题,需要依次作出n个决策,如果这个决策序列是最优的,对于任何一个整数k,
,无论前面k个决策
是怎样的,以后的最优决策只取决于由前面决策所确定的当前状态,即以后的决策序列
也是最优的。
最优性原理体现为问题的最优子结构特性,最优子结构特性是动态规划求解问题的必要条件。
个人觉得递推算法的思想是动态规划算法的第一步。
动态规划实施步骤
1. 把所求最优化问题分成若干个阶段,找出最优解的性质,并刻划其结构特性。
2. 将问题各个阶段时所处不同的状态表示出来,确定各个阶段状态之间的递推关系,并确定初始条件。
3. 应用递推求解最优值
4. 根据计算最优值时所得到的信息,构造最优解,构造最优解就是具体求出最优决策序列。
示例
1. 插入乘号问题,n在一个由n个数字组成的数字串中插入r个乘号(1≤r<n),将它分成r+1个整数,找出一种乘号的插入方法,使得这r+1个整数的乘积最大。例如:在数字串847313926中插入5个乘号,分为6个整数相乘,使乘积最大的最优解为: