DP:考虑且仅仅考虑由前一阶段状态转移到当前状态后,递推并选取出当前状态的最优解,具有无后效性和最优子结构的基本特征,其中所谓的无后效性是指:“下一时刻的状态只与当前状态有关,而和当前状态之前的状态无关,当前的状态是对以往决策的总结”。因此DP是由前一阶段的一系列阶段转移并选取最优而来,即抵达当前状态路径不唯一,仅是最终最优结果唯一。
DP设计的具体步骤:
(1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。
(2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。
(3)确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两段各状态之间的关系来确定决策。
(4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。
树形DP则正是基于当前结点的状态只取决于其孩子状态(已经使用父亲兄弟表示法),然后从其孩子的每一个兄弟状态转移到当前结点的最优状态。
贪心:对于尚未加入解集的元素按固定策略(最大或最小)选取状态转移,妄图从局部最优达到整体最优,也具有最优子结构性质,但转移路径单一,一旦确定贪心策略后就是一条路走到底,没有多余的状态供给选择。显然,最终结果也必定唯一,具有后效性,即当前最优状态与之前的选取路径中全部节点都有关。
相对DP来讲,当然贪心算法效率要高,但是有些问题用贪心往往无法求解,因为一些限制(如0-1背包中的背包不一定要装满)贪心无法在满足的条件下且同时达到最优,这样一来就只能使用DP枚举全部可转移的状态,从而递推出最优解。个人觉得,若限制条件较多,应该偏向于DP,若限制条件较少(一般为一个)则可以考虑贪心算法,
以上为个人的一点浅薄认识,望过路各位神牛给予指摘和评价。