介绍
动态编程解决的问题必须包含两个重要属性(至少其一)
- 重复子问题
- 最优子结构属性
今天我们讨论最优子结构属性。
如果一个问题的最优解决方法可以通过使用它的子问题的最优解决方法的话,那么表示这个问题具有最优子结构属性。
例如,最短路径问题就具有最优子结构属性,如果节点x在从节点u到节点v的最短路径上,那么从u到v的最短路径就是从u到x和从x到v的最短路径的结合。
但是最长路径问题就不具有最优子结构属性。考虑如下图,从q到t的最长路径是:q->r->t和q->s->t,不像最短路径,最长路径 问题没有最优子结构,例如,q->r->t的最长路径并不是从q->r最长路径和从r到t最长路径的集合。因为从q->r最长路径是q->s->t->r,从r->t最长路径是r->q->s->t。