正如我们在第1组中讨论的那样,以下是问题的两个主要属性,这些属性表明可以使用动态编程来解决给定的问题:
1)重叠子问题
2)最佳子结构
我们已经在集合1中讨论了“重叠子问题”属性。让我们在这里讨论“最佳子结构”属性。
2)最优子结构:如果可以通过使用子问题的最优解来获得给定问题的最优解,则给定问题具有最优子结构属性。
例如,最短路径问题具有以下最佳子结构属性:
如果节点x位于从源节点u到目标节点v的最短路径中,则从u到v的最短路径是从u到x的最短路径和从x到v的最短路径的组合。标准的“全对最短路径”算法诸如Floyd–Warshall和Bellman–Ford等都是动态编程的典型示例。
另一方面,最长路径问题不具有“最佳子结构”属性。在这里,最长路径是指两个节点之间的最长简单路径(无循环的路径)。考虑以下CLRS书中给出的未加权图。从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。
我们将在以后的动态编程文章中介绍一些示例问题。
参考:
http://en.wikipedia.org/wiki/Optimal_substructure
CLRS书