算法导论笔记(四)

来源:互联网 发布:动易cms 无法上传视频 编辑:程序博客网 时间:2024/05/17 04:12

第八章:动态规划

1.币值最大化问题:

给定一排硬币,不能选相邻的两枚硬币

Fn = {包括这枚币 + Fn-2 , 不包括这枚币 Fn-1}

f0 = 0 

类似斐波那契?

自底向上计算最大的币值,f0,f1...

2.找零问题:

F(n) = min{f (n - dj)} + 1  dj为各种币值

自底向上计算最少找零数

3.收集硬币问题

Fn  = max(F(i-1,j),F(i,j-1)}

自底向上填表格计算收集的最大钱币数

4.背包问题

Fn = max{F(i,j-wi),F(i-1,j)}比较带它,可携带重量变成j - wi,和不携带他,可携带重量不变的两种情况的最大值

5.最优二叉树的查找算法(动态规划):

每个节点存在一个概率p i

C(1,n) = ∑pi * long(i) 节点i的层数

eg.一棵以ak为根节点的最优二叉树的

c(i,j) = pk * 1 + min{∑s∈(i~k-1)(ps * s的层数+1) + ∑s∈(k+1,j) (ps * s的层数+1)}

=∑s∈(i,j) ps + min{C(i,k-1) +C (k+1,j)}

填表找最小

6.warshall算法和floyd算法

warshall算法:

有向图、邻接矩阵、传递闭包

war shall算法只通过一次遍历来实现构造传递闭包

两个性质:Rk-1中为1的Rk中也一定为1

Rk-1 中为0的在Rk中,rij = 1只有在i行k列 = 1 k行j列= 1时候rij会变为1

算法为:三个for循环最里面为or and and 来以此确定 rij的值

Floyd算法:

计算完全最短路径

init dij = 无穷

看图修改距离

dij = {dij,dik-1,dk-1j}

三个for循环遍历