动态规划

算法:动态规划

1 概述

1.1 状态

状态是一组量化参数,用于描述一个特定局面。

例如:

为状态赋予问题:

状态 (State)→算法 (Algorithm)问题 (Problem)解/值 (Solution/Value) \text{状态 (State)} \xrightarrow[\text{算法 (Algorithm)}]{\text{问题 (Problem)}} \text{解/值 (Solution/Value)}


V = f(State)

例如:

状态的值通常是最优值、方案数、概率
例如:

1.2 状态转移与路径

状态在规则和约束下,可以转移到另一个状态,同时伴随着状态值的变化。

State A(VA)→规则 (Rules),约束 (Constraints)行动 (Action)State B(VB) \text{State A} (V_A) \xrightarrow[\text{规则 (Rules),约束 (Constraints)}]{\text{行动 (Action)}} \text{State B} (V_B)


例如:

路径是一条由连续的状态转移构成的状态序列

例如:
初始状态 → 状态 A → 状态 B → … → 目标状态

子状态:路径上离目标状态更近的状态
子问题:子状态下的同一问题

1.3 动态规划(问题)三要素

符合以下要素的问题适合用动态规划求解:

Ask AI:

举几个例子,符合最优子结构但不符合无后效性,以及反过来

1.4 动态规划

如果问题满足上述三要素,
可以将目标问题分解为子问题求解:
f(S) -> f(s1), f(s2), ...

V=f(S)→V=g[f(s1),f(s2),...,s1,s2,...] V = f(S) \rightarrow V = g[f(s1), f(s2), ..., s1, s2, ...]

动态规划是一种策略:通过“记忆”子问题的解,来避免重复计算,从而高效解决原问题的算法。

  1. 找出合适的状态和问题(通常就是原问题)
  2. 使用 dp[state] 数组记录各状态下的值
  3. 写状态转移方程 dp[S] = f(dp[s1], dp[s2], ..., s1, s2, ...)记录当前状态的值如何从子状态的值转移得来,从初始状态一直记录到目标状态
  4. 最后由各状态的值求出最终解(通常是目标状态的值)