Archipelago

Lec 17动态规划 III:APSP、括号与钢琴指法

讲义完成更新于 2026-09-16

Lec 17 动态规划 III:APSP、括号与钢琴指法

资料依据:课程视频与 transcript · Lecture notes

TL;DR

  • Floyd–Warshall 用“中间顶点只允许来自前 kk 个顶点”作为状态扩展,在 Θ(∣V∣3)\Theta(|V|^3) 时间求得 APSP。
  • 区间动态规划把子串或子数组当作子问题,通过猜测最后一次分割或匹配位置组合更小区间。
  • 钢琴指法把时间索引和当前手指组成状态,形成分层 DAG,路径成本则表示相邻指法转换的难度。

本讲导览

  • Bellman-Ford SSSP
  • Flayd-Wallshall APSP
  • 算术括号问题
  • 钢琴指法问题

单源最短路径:Bellman-Ford 算法

SRTBOT 分析:

  • Subproblems

    • 扩展子问题,使其无环
    • δk(s,v)=\delta_k(s, v) = 从 s 到 v 的最短路径权重, 最多使用 k 条边
    • for v∊Vv ∊V & 0<=k<=∣V∣0 <= k <= |V|
  • Relate

    • 𝛿_k(s,v)=min⁡{𝛿_k−1(s,u)+w(u,v)∣u∊Adj(v)}∪𝛿k−1(s,u)𝛿\_k(s, v) = \min \left\{𝛿\_{k-1}(s, u) + w(u, v) | u ∊ Adj(v) \right\} ∪ {𝛿_{k-1}(s, u)}

    • guessing "lost edge(u, v) on shortest s->v path"

观察到,𝛿_k(s, v) = 𝛿_{k-1}(s, u) + w(u, v),这个递归不存在循环。如果随着 k 增长,都是满足上述等式,

  • Topological order: increasing k

Topo order of G

  • Base case: 𝛿_{0}(s, s) = 0 , 𝛿_{0}(s, v) = ∞ for v ≠ s

  • Original: 𝛿_{|v| -1}(s, v) for v ∊ V: 𝛿_{|v|}(s,v) for neg-weight cycle detection

  • Time:

    • 子问题数目:∣V∣×(∣V∣+1)|V| \times (|V| + 1)
    • 每个子问题的工作量δk(s,v):O(degin(v))\delta_k(s, v): O(deg_{in}(v))
    • 总的时间:∑k=0∣V∣∑v∈VO(∣degin(v)∣)=∑k=0∣V∣O(∣E∣)=O(∣V∣⋅∣E∣)\sum^{|V|}_{k=0}\sum_{v \in V}O(|deg_{in}(v)|) = \sum^{|V|}_{k=0}O(|E|) = O(|V|·|E|)

全源最短路径: Floyd-Warshall 算法

弗洛伊德演算法。

顶点标上序号 1, 2, ... |V|

  • subprobs: d(u, v, k) = u->v 最短路径的权重,其中仅用到在集合{u, v} ∪ {1, 2, ...,k}的顶点 for u, v ∊ V & 0 <= k <= |V|, θ(|V|^3)

  • Relate: d(u, v, k) = min⁡{d(u,v,k−1),d(u,k,k−1)+d(k,v,k−1)}\min \left\{d(u, v, k-1), d(u, k, k-1) + d(k, v, k-1)\right\}

    • u --(1,...,k-1)---> v (第一种情况,不需要使用 k).即 k ∉SP
    • u --(k-1)--->k, k ---(k-1)--->v, 即 k ∊SP
  • topo: increasing k, for k = 0, 1, ... |v| for u ∉ V for v ∊V

  • Base: S(u, v, 0) =

    1. 0 if u = v ;
    2. w(u,v) if (u, v) ∊ E
    3. ∞ otherwise

    并且假设没有负权重环

  • Orignialfeas

钢琴指法问题

问题描述:

给定序列t0,t1,...tn−1t_0, t_1, ...t_{n-1} 单音符,用右手弹奏,右手手指分别是 1,2,...,f,给定过渡从音符 t 及其手指 f,到音符 t'及其手指 f'的难度度量d(t,f,t′,f′)d(t, f, t', f')

  • 如果1<f<f′1 \lt f \lt f' 且 t>t′t > t',则是不舒适的
  • 连续(平滑)演奏要求 t=t′t = t' (否则罚分是无限大)
  • 弱指规则,尽量避免使用 f′∈{4,5}f' \in \left\{4, 5\right\}
  • {f,f′}={3,4}\left\{f, f'\right\} = \left\{3, 4\right\} 是令人烦恼的

目标: 为音符分配手指,以最小化总难度

第一次尝试 SRTBOT 分析:

  • Subproblem

    • x(i) = 最小化的演奏难度分,弹奏音符为ti,ti+1,...,tn−1t_i, t_{i+1}, ..., t_{n-1}
  • Relate

    • 猜测第一个手指, 给tit_i 分配 f 手指
    • x(i)=min⁡{ x(i+1)+d(ti,f,ti+1,?)∣1≤f≤F }x(i) = \min \set {x(i+1) + d(t_i, f, t_{i+1}, ?) | 1 \le f \le F}
    • 没有足够的信息来填写 ?
    • 问题
      • 需要知道在开始x(i+1)x(i+1)时使用哪个手指
      • 不同的起始手指可能会影响 x(i+1)x(i + 1) 和 d(ti,f,ti+1,?)d(t_i, f, t_{i+1}, ?) 的结果
    • 解决方案
      • 需要一个表来映射起始手指到x(i+1)x(i+1)的最优解
      • 也就是说,需要通过起始条件来扩展子问题

最终解决方案 SRTBOT 分析:

  • Subproblem

    • x(i,f)x(i, f) 最小化的演奏难度分,弹奏音符为ti,ti+1,...,tn−1t_i, t_{i+1}, ..., t_{n-1},并且手指 f 在字符tit_i
    • For 0≤i<n0 \le i \lt n 且 1≤f≤F1 \le f \le F
  • Relate

    • 猜测下个手指: 将 f' 分配给 ti+1t_{i+1}
    • x(i,f)=min⁡{x(i+1,f′)+d(ti,f,ti+1,f′)∣1≤f′≤F}x(i, f) = \min \left\{x(i+1, f') + d(t_i, f, t_{i+1}, f') | 1 \le f' \le F\right\}
  • 拓扑顺序

    • 逐步减小 i (任何 f 顺序)
  • Base

    • x(n−1,f)=0x(n-1, f) = 0 没有转换
  • Original

    • min⁡{x(0,f)∣1≤f≤F}\min \left\{x(0, f) | 1\le f \le F\right\}
  • Time

    • Θ(n · F) subproblems
    • Θ(F) work per subproblem
    • Θ(n⋅F2)Θ(n · F^2)

我的理解

我的理解

“增加一个维度”不只会让状态数变大,也可能让递推变得可写:Floyd–Warshall 的 kk 和钢琴指法的手指状态都是为了精确记录后续决策所需的边界信息。