|
1 | | -## 1. 区间 DP 简介 |
| 1 | +## 1. 区间动态规划简介 |
2 | 2 |
|
3 | | -> **区间 DP**:线性 DP 的一种,以「区间长度」划分阶段,以两个坐标(区间的左、右端点)作为状态的维度。一个状态通常由被它包含且比它更小的区间状态转移而来。 |
| 3 | +### 1.1 区间动态规划定义 |
4 | 4 |
|
5 | | -## 2. 区间 DP 的应用 |
| 5 | +> **区间动态规划**:线性 DP 的一种,简称为「区间 DP」。以「区间长度」划分阶段,以两个坐标(区间的左、右端点)作为状态的维度。一个状态通常由被它包含且比它更小的区间状态转移而来。 |
| 6 | + |
| 7 | +区间 DP 的主要思想就是现在小区间内得到最优解,再利用小区间的最优解合并,从而得到大区间的最优解,最终得到整个区间的最优解。 |
| 8 | + |
| 9 | +常见的区间 DP 的状态转移方程一般为:$dp[i][j] = max / min \lbrace dp[i][k] + dp[k + 1][j] + cost \rbrace,\quad i < k \le j$。 |
| 10 | + |
| 11 | +- 其中状态 $dp[i][j]$ 表示为:区间 $[i, j]$ (即下标位置 $i$ 到下标位置 $j$ 上所有元素)上的最大价值。 |
| 12 | +- $cost$ 表示为:将两个区间 $[i, k]$ 与 $[k + 1, j]$ 中所有元素合并起来的代价。 |
| 13 | +- 这里的 $max / min$ 取决于题目是求最大值还是求最小值。 |
| 14 | + |
| 15 | +### 1.2 区间 DP 问题的基本思路 |
| 16 | + |
| 17 | +区间 DP 的基本解题思路比较固定,具体步骤如下: |
| 18 | + |
| 19 | +1. 枚举区间长度; |
| 20 | +2. 枚举区间的起点,根据区间起点和区间长度得出区间终点; |
| 21 | +3. 枚举区间的分割点,根据状态转移方程计算合并区间后的最优值。 |
| 22 | + |
| 23 | +对应代码如下: |
| 24 | + |
| 25 | +```Python |
| 26 | +for l in range(2, n): # 枚举区间长度 |
| 27 | + for i in range(1, n): # 枚举区间起点 |
| 28 | + j = i + l - 1 <= n # 根据起点和长度得到终点 |
| 29 | + if j > n: |
| 30 | + break |
| 31 | + dp[i][j] = float('-inf') # 初始化 dp[i][j] |
| 32 | + for k in range(i, j + 1): # 枚举区间分割点 |
| 33 | + # 状态转移方程,计算合并区间后的最优值 |
| 34 | + dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j] + cost[i][j]) |
| 35 | +``` |
| 36 | + |
| 37 | +## 2. 区间 DP 问题的应用 |
| 38 | + |
| 39 | +下面我们根据几个例子来讲解一下区间 DP 问题的具体解题思路。 |
| 40 | + |
| 41 | +### 2.1 合并石头的最低成本 |
| 42 | + |
| 43 | +### 2.2 最长回文子串 |
| 44 | + |
| 45 | +### 2.3 戳气球 |
0 commit comments