后继问题(子问题)就是原来问题的继续
多阶段决过程 后面每一步的决策都需要利用前面的结果来做这一步的选择(本质还是列出所有的解)(与贪心有着本质的不同)
子问题界定
后边界不变 前边界减一
最短路的依赖关系、叫优化原则也叫最优化子结构性子
- 一个最优决策序列的任何子序列本身一定是相对于子序列的初始和结束状 态的最优决策序列。
- 问题的最优包含子问题的最优
起点-------------------------------------------------------------------终点
子问题起点---------------------------------------子问题终点
问题的最优包含子问题的最优
F(Cl) = min{Cl,Tm}
F(Bk) = min{BkCl,F(Cl)}
F(Aj) = min{AjBk + F(Bk) }
F(Si) = min{SiAj+F(Aj)}
- 基础
子问题的划分
S[i,j] = k 表示划分为之
时间复杂度
空间换时间
因为不同的路径会产生相同的子问题,会导致多次重复计算子问题
所以对同一个子问题用备忘录记起来,提高效率吧
问题的复杂度高 因为同一个子问题被多次计算
备忘录的结构 和解的追钟(设计标记函数)
设计子问题的计算顺序 ,好当这个问题求解的时候可以用到备忘录离得解
根据这样的顺序来迭代计算 这样计算到后面会用到前面的解
子问题计算顺序
工作量
设计动态规划算法方法
两个不同的类型界定函数
列出地推方程
设计备忘录
向和估计时间复杂度
投注问题
追中介表中装的是第k个物品
动态规划算法
建模组合优先原则
BFS
P问题
P类问题的概念:如果一个问题可以找到一个能在多项式的时间里解决它的算法,那么这个问题就属于P问题
NP问题
接下来引入NP问题的概念。这个就有点难理解了,或者说容易理解错误。在这里强调(回到我竭力想澄清的误区上),NP问题不是非P类问题。NP问题是指可以在多项式的时间里验证一个解的问题。**NP问题的另一个定义是,可以在多项式的时间里猜出一个解的问题。**比方说,我RP很好,在程序中需要枚举时,我可以一猜一个准。现在某人拿到了一个求最短路径的问题,问从起点到终点是否有一条小于100个单位长度的路线。它根据数据画好了图,但怎么也算不出来,于是来问我:你看怎么选条路走得最少?我说,我RP很好,肯定能随便给你指条很短的路出来。然后我就胡乱画了几条线,说就这条吧。那人按我指的这条把权值加起来一看,嘿,神了,路径长度98,比100小。于是答案出来了,存在比100小的路径。别人会问他这题怎么做出来的,他就可以说,因为我找到了一个比100 小的解。在这个题中,找一个解很困难,但验证一个解很容易。验证一个解只需要O(n)的时间复杂度,也就是说我可以花O(n)的时间把我猜的路径的长度加出来。那么,只要我RP好,猜得准,我一定能在多项式的时间里解决这个问题。我猜到的方案总是最优的,不满足题意的方案也不会来骗我去选它。这就是NP问题。
就是已经知道一个问题的解,如果仅仅针对这个解来进行解答,那么花费多项式时间可以获得这个解
如下图 我们已经知道最短路径是S3 A3 B4 C4 T4
-
那么从S3开始经过 A3 B4 C4 到达T4的S3 ->A3-> B4 ->C4 ->T4 这个路径(算法就是本来要遍历很多条路径才能的到这条路径,现在我知道是这条路径,我按照这条路径走,看看是否在多项式的时间内可以达到,若能达到,那就是np问题,达不到就是npc问题)
-
那么从S3开始经过 A3 B4 C4 到达T4的S3 ->A3-> B4 ->C4 ->T4 这个路径(算法就是本来要遍历很多条路径才能的到这条路径,现在我知道是这条路径,我按照这条路径走,看看是否在多项式的时间内可以达到,若能达到,那就是np问题,达不到就是npc问题)