【算法概论】6.动态规划

6 动态规划

6.1 重新审视DAG的最短路径问题

  • 有向无环图DAG的节点可以被线性化:

6.1 A dag and its linearization-topological ordering.

procedure dag-shortest-paths(G,l,s)
    Input:  Graph G=(V,E), dag;
            edge lengths {le:e ∈ E};
            vertex s ∈ V
    Output: For all vertices u reachable from s,dist(u) is set
            to the distance from s to u.

    for all u ∈ V
        dist(u)= ∞
    dist(s)=0
    Linearize G //通过深度优先搜索线性化(拓扑排序)
    for each u ∈ V in Linearized order:
        for all edges (u,v) ∈ E:
            dist(v)=min(dist(u)+l(u,v))

6.2 最长递增子序列

6.2 The dag of increasing subsequences

for j=1,2,...,n
    L(j)=1+max{L(i):(i,j) ∈ E}
return L
//i为j的前驱,求反转图Gr即可

6.3 编辑距离

将两个单词进行对齐,对齐代价对应字母不相同列数

6.3 two possible alignments of SNOWY and SUNNY

6.3.1 一种动态规划的解

寻找两个字串: x[1...m],y[1...n] 之间的编辑距离 E(m,n) ,考虑字符串的前缀 x[1...i],y[1...j] 的编辑距离 E(i,j)

则:

E(i,j)=min{1+E(i1,j),1+E(i,j1),diff(i,j)+E(i1,j1)}

for i=0,...,m:
    E(i,0)=i
for j=0,...,n:
    E(0,j)=j
for i=1,...,m:
    for j=1,...,n:
        E(i,j)=min{1+E(i-1,j),1+E(i,j-1),diff(i,j)+E(i-1,j-1)}
return E

6.3.2 隐含的dag

每个动态规划都隐含着一个dag结构:每个节点表示一个子问题,每条边表示解决子问题时的先后约束。 6.5 The underlying dag, and a path of length 6

除边 {(i1,j1)(i,j):x[i]=y[j]} 为0外,其余边为0;问题转为求点 s=(0,0) 到点 t=(m,n) 的最短距离。

其中,为使 EXPONENTIAL 转为 POLYNOMIAL

  • 向下表示删除
  • 向右表示插入
  • 向对角线表示匹配或替换

    6.5 The underlying dag, and a path of length 6_2

6.4 背包问题

  • n件物品,W总重量的背包,复杂度 O(nW)

6.4.1 多副本背包问题

  • Knapsack with repetition

K(w)=wK(w)=maxi:wiw{K(wwi)+vi}

K(0)=0
for w=1 to W
    K(w)=max{K(w-w_i)+v_i:w_i≤w}
return K(W)

6.4.2 单副本背包问题

  • Knapsack without repetition

K(w,j)=w1...jK(w)=max{K(wwi,j1)+vi,K(w,j1)}

for j=1...n:
    K(0,j)=0
for w=1...W:
    K(w,0)=0
for j=1...n:
    for w=1...W:
        if w_j > w:
            K(w,j)=K(w,j-1)
        else:
            K(w,j)=max{K(w,j-1),K(w-w_j,j-1)+v_j}
return K(W,n)

6.5 矩阵链式相乘

  • A[m0,m1]A[m1,m2]O(m0m1m2)
  • 求n个矩阵相乘: A1A2...An

C(i,j)=AiAi+1...AjC(i,j)=minik<j{C(i,k)+C(k+1,j)+mi1mkmj}

for i=1...n:
    C(i,i)=0
for s=1...n-1:
    for i=1...n-s:
        j=i+s
        C(i,j)=min{C(i,k)+C(k+1,j)+m(i-1)*m(k)*m(j):i≤k<j}
return C(1,n)

6.6 最短路径问题

6.6.1 最短可靠路径

  • 求s到t最多经过k条边的最短路径

dist(v,i)=svidist(v,i)=min(u,v)E{dist(u,i1)+l(u,v)}

6.6.2 所有顶点间的最短路径

  • 包含负边的s源点最短路径算法复杂度 O(|V||E|) ;对每一个顶点进行遍历,则复杂度为 O(|V|2|E|)
  • 基于动态规划的Floyd-Warshall算法,复杂度为 O(|V|3)

shortestPath(i,j,k)=使{1,...,k}ijshortestPath(i,j,k+1)=min(shortestPath(i,j,k),shortestPath(i,k+1,k)+shortestPath(k+1,j,k))

let dist be a |V| × |V| array of minimum distances initialized to ∞ (infinity)
for each vertex v
   dist[v][v] ← 0
for each edge (u,v)
   dist[u][v] ← w(u,v)  // the weight of the edge (u,v)
for k from 1 to |V|
   for i from 1 to |V|
      for j from 1 to |V|
         if dist[i][j] > dist[i][k] + dist[k][j] 
            dist[i][j] ← dist[i][k] + dist[k][j]
         end if

6.6.3 旅行商问题TSP

  • 对于包含城市1的子集 S{1,2,...,n} ,以及 jS ,令 C(S,j) 为由1出发、终点为j的经过s所有节点恰好一次的最短路径长度。 O(n22n)

C(S,j)=miniS:ij{C(S{j})+dij}

function algorithm TSP (G, n)
   for k := 2 to n do
     C({1, k}, k) := d(1,k)
   end for

   for s := 3 to n do
     for all S ⊆ {1, 2, . . . , n}, |S| = s do
       for all k ∈ S do
         {C(S, k) = min_{m≠1,m≠k,m∈S} [C(S − {k}, m) + d(m,k) ]}
       end for
     end for
   end for

   opt := min_{k≠1} [C({1, 2, 3, . . . , n}, k) + d(k,1)]
   return (opt)
 end

6.7 树中的独立集

  • 选定中任意节点r为树根,子问题:

I(u)=uI(u)=max{1+wuI(w),wuI(w)}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值