动规
动规就是动态规则的意思。前面讲到
分治算法是把大问题分解成多个独立的小问题来求解,但很多问题分解后子问题并不是独立的,或者说如果要分解成独立的子问题,子问题太多,这样反而降低了性能。在这些不独立的子问题中,有很多数据被重复计算,其实这些重复计算的数据可以通过一个表达式来保存,就可以避免很多重复的计算。
动规用一个表来记录计算过的子问题的答案,通过填表的方式来求得最终的节点。在填表的过程中,需要用到前面的结果,通过最优值的表达式来计算下一步的结果。动态规划可以解决很多最优值的问题,动规问题的基本求解过程如下
(1)根据最优解的性质,构造求解表达式
(2)确定范围
(3)自底向上计算最优值
(4)根据求得的最优值,构造最优解
其中最难的就是确定最优值的关系,最优值的关系构造时基本都是基于递归的,然后从低向上构造最优解。要用动规来解决问题,就必须要构造最优值之间的关系,但不是所有的问题的最优值都能建立起关系,只有具有最优子结构的问题才能构造出最优值之间的关系。最优子结构是指如果用子问题求出的最优解来求父问题的解一定也是最优的。比如说求从A到C的最短路径,而A到C必须经过B,那么求出A到B的最短路径和B到C的最短路径就一定能求出A到C的最优路径。