dijkstra算法、动态规划与贪心

dijkstra算法属于贪心,而不是动态规划。

所谓无后效性,是指状态一旦确定,就不会因为后续的、未来的决策所改变,也即影响状态决策的只有前效,没有后效。
而这里的“后续”一词,天然隐含地要求你找到一个“处理顺序”,结合状态转移方程,共同对“状态”进行决策。
因此,你必须先根据最优子结构的思想,把问题分解为子问题,然后假设这些子问题的状态在此之前全部已确定,写出状态转移方程。
其次,你必须找到一个“处理顺序”,实现“子问题的状态在此之前全部已确定”。
最后才能判断“状态”是否具有无后效性,如果你找到得到状态转移方程和处理顺序,那么便具有无后效性,否则不具备。

【尝试用动态规划解决单源最短路径问题】
状态转移方程:d[e] = min{ d[a]+graph[a][e], d[b]+graph[b][e], d[c]+graph[c][e], … }
易知边界条件,d[S]=0。
方程中a, b, c都是与e相邻的、最短距离全都已知的点。
但无法找到一个处理顺序,保证每一次处理新的点时,其相邻点状态在此之前都全部确定。

【dijkstra算法】
实际上,每次确定状态时,具体确定谁的状态是无法在计算之前知道的,算法实际操作中,首先确定中介点,然后更新d[]数组,里面谁最小就确定了谁的状态。因此这里没有确定处理的“顺序”,dijkstra算法的思想不完全符合动态规划。

【不用动态规划求解】
既然无法在一次遍历中求解,那么可以多次循环,不断更新最小值,直到无法再小,这就是Bellman Ford算法,Floyd算法了。

猜你喜欢

转载自blog.csdn.net/sinat_37517996/article/details/104548055