动态规划算中的子结构、阶段,状态之间的关系辨析
在动态规划(DP)里,子问题、阶段、状态是层层递进、紧密关联的三个核心概念。
简单来说:阶段是解决问题的 “时间 / 顺序”,状态是每个阶段的 “快照 / 信息”,子问题是每个状态下要解决的 “小任务”。
下面用最清晰、最严谨的逻辑帮你理顺它们的关系:
一、三个概念的定义
1、子问题(Subproblem)
把原问题拆成更小、结构相同的问题,每个子问题都有输入和答案,动态规划的本质是用子问题的答案推原问题答案。
2、阶段(Stage)
问题解决过程的时间 / 顺序划分,阶段是有序的,必须按顺序求解,例如,第 i 步、第 i 个物品、第 i 行、第 i 年。
3、状态(State)
每个阶段中,描述问题当前情况的最小信息集合,状态 = 阶段 + 关键特征,状态决定了接下来能做什么、能转移到哪里。
二、三者关系
1、阶段 → 状态
一个阶段可以有多个状态
阶段是 “时间轴”,状态是 “时间点上的不同情况”
例:背包问题
阶段:选到第 i 个物品
状态:(i, j) → 前 i 个物品、背包容量 j
2、状态 → 子问题
每个状态对应一个子问题
状态就是子问题的 “输入参数”
子问题的答案 = 状态的值(dp [i][j])
例:dp [i][j] 就是 “前 i 个物品、容量 j 时的最大价值” 这个子问题的答案。
3、子问题 → 原问题
原问题 = 最后一个阶段的某个状态对应的子问题
例如:dp [n][C] 就是背包问题的答案
三、总结关系
阶段是顺序,状态是阶段中的情况,子问题是每个状态要解决的任务。
- 阶段:什么时候
- 状态:什么情况
- 子问题:这个情况要算什么
- 阶段是 “时间 / 顺序” 的划分,子问题是 “规模” 的划分
阶段 (Stage)侧重于过程的顺序。比如:走楼梯的第 1 步、第 2 步、第 3 步... 是按顺序走的。子问题 (Subproblem)侧重于问题的规模。比如:求 “走到第 n 阶” 的解,可以拆解为求 “走到第 n-1 阶” 和 “走到第 n-2 阶” 的解。
在线性 DP(如斐波那契、爬楼梯、最长递增子序列)中,阶段和子问题是对应的,第 k 个阶段 = 解决规模为 k 的子问题。但在更复杂的 DP(如区间 DP、背包 DP)中,阶段和子问题不对应的,如期区间 DP中,阶段是 “区间长度”,子问题是 “某个具体区间”。又如背包 DP中,阶段是 “物品个数”,子问题是 “前 i 个物品装容量 j 的背包”。
四、用一个例子说明(最长上升子序列 LIS)
问题:求数组的最长上升子序列长度
阶段:i(处理到第 i 个数)
状态:dp [i](以第 i 个数结尾的最长上升子序列长度)
子问题:求以第 i 个数结尾的 LIS 长度
关系:
dp [i] = max (dp [j] + 1) (j < i 且 a [j] < a [i])
用前面阶段的状态,推当前阶段的状态
五、解题流程链
原问题
↓ 拆分
子问题
↓ 按顺序求解
阶段
↓ 每个阶段的不同情况
状态
↓ 状态转移
得到答案
六、下面用背包问题、LIS、路径问题三个最经典的动态规划题为例说明。
1、01 背包问题(最标准 DP)
问题:n 个物品,容量 C,求最大价值。
三者关系
阶段:i(选到第 i 个物品)顺序为1→2→…→n
状态:dp [i][j]——前 i 个物品、容量 j 时的最大价值
子问题:「前 i 个物品、容量 j,最大价值是多少?」→ 每个状态对应一个子问题
关系链:阶段 i → 状态 (i,j) → 子问题,求 dp [i][j]
2、最长上升子序列 LIS
问题:求数组最长上升子序列长度。
三者关系
阶段:i(处理到第 i 个数)顺序为1→2→…→n
状态:dp [i]——以第 i 个数结尾的最长上升子序列长度
子问题:「以第 i 个数结尾的 LIS 长度是多少?」
关系链:阶段 i → 状态 (i) → 子问题,求 dp [i]
3、最短路径问题(网格 / 矩阵)
问题:从 (1,1) 到 (n,m),只能右 / 下,求最小路径和。
三者关系
阶段:步数 k(或行 i + 列 j)顺序为k=2→3→…→n+m
状态:dp [i][j]——走到 (i,j) 的最小路径和
子问题:「走到 (i,j) 的最小路径和是多少?」
关系链
阶段 k → 状态 (i,j) → 子问题,求 dp [i][j]
三者关系总结
阶段 = 顺序 必须按顺序算
状态 = 阶段 + 特征 描述当前情况
子问题 = 状态对应的问题 求状态的值
概括:阶段定顺序,状态定情况,子问题定计算。
七、动态规划:阶段、状态、最优子结构 关系结构图
┌─────────────────────────────────────────────────────────────┐
│ 【问题整体】 │
└───────────────────────────┬─────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 【阶段 Stage】 │
│ 按时间/步骤/层次把问题切分成有序片段 │
│ 例:第1步、第i天、前i个物品、第i层决策 │
└───────────────────────────┬─────────────────────────────────┘
│ 每个阶段内包含若干状态
▼
┌─────────────────────────────────────────────────────────────┐
│ 【状态 State】 │
│ 阶段内的“局面描述”,是决策的基础 │
│ 例:dp[i]、dp[i][j]、当前剩余容量、当前位置 │
└─────────┬───────────────────┬────────────────────┬───────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 状态转移方程 │ │ 状态转移方程 │ │ 状态转移方程 │
│ dp[i] = f(...) │ │ dp[i][j] = ... │ │ ... │
└─────────┬───────┘ └────────┬────────┘ └────────┬────────┘
│ │ │
└────────────────────┼────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 【最优子结构 Optimal Substructure】 │
│ 当前状态的最优解 ⇦ 由若干**子状态的最优解**组合而来 │
│ 无后效性:只关心子问题最优值,不关心怎么来的 │
│ 核心性质:子问题最优 → 原问题最优 │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 【最终最优解】 │
└─────────────────────────────────────────────────────────────┘
总结关系:
- 阶段是对问题的时间 / 层次划分;
- 状态是每个阶段里的具体局面;
- 最优子结构是状态之间的最优推导规则,保证 DP 成立。

浙公网安备 33010602011771号