Lec 17动态规划 III:APSP、括号与钢琴指法
Lec 17 动态规划 III:APSP、括号与钢琴指法
资料依据:课程视频与 transcript · Lecture notes
TL;DR
- Floyd–Warshall 用“中间顶点只允许来自前 个顶点”作为状态扩展,在 时间求得 APSP。
- 区间动态规划把子串或子数组当作子问题,通过猜测最后一次分割或匹配位置组合更小区间。
- 钢琴指法把时间索引和当前手指组成状态,形成分层 DAG,路径成本则表示相邻指法转换的难度。
本讲导览
- Bellman-Ford SSSP
- Flayd-Wallshall APSP
- 算术括号问题
- 钢琴指法问题
单源最短路径:Bellman-Ford 算法
SRTBOT 分析:
-
Subproblems
- 扩展子问题,使其无环
- 从 s 到 v 的最短路径权重, 最多使用 k 条边
- for &
-
Relate
-
-
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:
- 子问题数目:
- 每个子问题的工作量
- 总的时间:
全源最短路径: 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) =
- 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) =
- 0 if u = v ;
- w(u,v) if (u, v) ∊ E
- ∞ otherwise
并且假设没有负权重环
-
Orignialfeas
钢琴指法问题
问题描述:
给定序列 单音符,用右手弹奏,右手手指分别是 1,2,...,f,给定过渡从音符 t 及其手指 f,到音符 t'及其手指 f'的难度度量
- 如果 且 ,则是不舒适的
- 连续(平滑)演奏要求 (否则罚分是无限大)
- 弱指规则,尽量避免使用
- 是令人烦恼的
目标: 为音符分配手指,以最小化总难度
第一次尝试 SRTBOT 分析:
-
Subproblem
- x(i) = 最小化的演奏难度分,弹奏音符为
-
Relate
- 猜测第一个手指, 给 分配 f 手指
- 没有足够的信息来填写 ?
- 问题
- 需要知道在开始时使用哪个手指
- 不同的起始手指可能会影响 和 的结果
- 解决方案
- 需要一个表来映射起始手指到的最优解
- 也就是说,需要通过起始条件来扩展子问题
最终解决方案 SRTBOT 分析:
-
Subproblem
- 最小化的演奏难度分,弹奏音符为,并且手指 f 在字符
- For 且
-
Relate
- 猜测下个手指: 将 f' 分配给
-
拓扑顺序
- 逐步减小 i (任何 f 顺序)
-
Base
- 没有转换
-
Original
-
Time
- Θ(n · F) subproblems
- Θ(F) work per subproblem
我的理解
我的理解
“增加一个维度”不只会让状态数变大,也可能让递推变得可写:Floyd–Warshall 的 和钢琴指法的手指状态都是为了精确记录后续决策所需的边界信息。