上2篇详细分析了动态规划的一些理解,传统的教材上就大概说了下空间换时间,记忆以避免重复计算等。
然后我们在文章中深入的分析和解释了交叠子问题是怎么表现的,最优子结构的表现,多阶段决策(无后效性)的表现,递推式(状态转移方程),一个状态表示一个子
问题的解,动态规划就是将问题划分为规模不是太大的子问题,动态规划填矩阵的顺序(拓扑排序)以及空间复杂度的优化跟什么有关等等。
计算二项式系数其实可以看成是不是解决最优问题的一个动态规划的特例,这节我们再来介绍2个动态规划的算法:Warshall算法(也可以说是不是最优问题,但它也可
以表现为动态规划的过程)和Floyd算法。
----------------------------------------------------------------------------------------------------------------------------------------------------
1,Warshall算法求传递闭包
问题的定义:
有向图的传递闭包表达的就是每个顶点之间的可达性 。当然,可以从每个起点开始深度或广度优先遍历,能遍历到的顶点就说明从这个点到它可达,这样来生成传递闭
包。这样做对图进行了多次遍历,我们希望找到更好一点的办法:
Warshall算法通过动态规划的形式, 以多阶段决策的方式来逐步构建 一个有向图的传递闭包:
1)有向图的邻接矩阵表示了一个有向图,实际上有向图的邻接矩阵我们可以看作是 没有经过任何中间顶点 ( 即一个点仅到它的邻接点为可达 )的图的传递闭包(传递
闭包的初始条件)
2)我们可以通过一次加入一个点的方式(一共n次,加入n个点,n步决策)来构造最终的传递闭包:
---- 用R0表示邻接矩阵,以后每次加入一个顶点来构造R1,R2.......Rn 。
---如果 r(i , j) 在Rk-1中为1,那么加入顶点k作为中间节点后,r(i , j) 在Rk中的值仍为1(如果可达了,加入点之后肯定还是可达)
--如果r(i , j)在Rk-1中不为1,仅当 r(i , k) = 1 且 r(k , j) = 1,r(i , j)在Rk中才为1(如果现在不可达,仅当加入的一个中间节点可以作为一个桥梁使之可达,才
可达)
即下面2条规则:
如果不想分2种情况,用与或式可以直接写成下式:
括号在”或“后面。
伪代码:
实现如下:
然后我们在文章中深入的分析和解释了交叠子问题是怎么表现的,最优子结构的表现,多阶段决策(无后效性)的表现,递推式(状态转移方程),一个状态表示一个子
问题的解,动态规划就是将问题划分为规模不是太大的子问题,动态规划填矩阵的顺序(拓扑排序)以及空间复杂度的优化跟什么有关等等。
计算二项式系数其实可以看成是不是解决最优问题的一个动态规划的特例,这节我们再来介绍2个动态规划的算法:Warshall算法(也可以说是不是最优问题,但它也可
以表现为动态规划的过程)和Floyd算法。
----------------------------------------------------------------------------------------------------------------------------------------------------
1,Warshall算法求传递闭包
问题的定义:
有向图的传递闭包表达的就是每个顶点之间的可达性 。当然,可以从每个起点开始深度或广度优先遍历,能遍历到的顶点就说明从这个点到它可达,这样来生成传递闭
包。这样做对图进行了多次遍历,我们希望找到更好一点的办法:
Warshall算法通过动态规划的形式, 以多阶段决策的方式来逐步构建 一个有向图的传递闭包:
1)有向图的邻接矩阵表示了一个有向图,实际上有向图的邻接矩阵我们可以看作是 没有经过任何中间顶点 ( 即一个点仅到它的邻接点为可达 )的图的传递闭包(传递
闭包的初始条件)
2)我们可以通过一次加入一个点的方式(一共n次,加入n个点,n步决策)来构造最终的传递闭包:
---- 用R0表示邻接矩阵,以后每次加入一个顶点来构造R1,R2.......Rn 。
---如果 r(i , j) 在Rk-1中为1,那么加入顶点k作为中间节点后,r(i , j) 在Rk中的值仍为1(如果可达了,加入点之后肯定还是可达)
--如果r(i , j)在Rk-1中不为1,仅当 r(i , k) = 1 且 r(k , j) = 1,r(i , j)在Rk中才为1(如果现在不可达,仅当加入的一个中间节点可以作为一个桥梁使之可达,才
可达)
即下面2条规则:
如果不想分2种情况,用与或式可以直接写成下式:
括号在”或“后面。
伪代码:
实现如下:
package Section8;
/* 第八章 动态规划 有向图传递闭包的Warshall算法 */
public class Warshall {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub