Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 419931e

Browse files
committed
Update 01.Interval-DP.md
1 parent f5a64fc commit 419931e

File tree

1 file changed

+43
-3
lines changed

1 file changed

+43
-3
lines changed
Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,45 @@
1-
## 1. 区间 DP 简介
1+
## 1. 区间动态规划简介
22

3-
> **区间 DP**:线性 DP 的一种,以「区间长度」划分阶段,以两个坐标(区间的左、右端点)作为状态的维度。一个状态通常由被它包含且比它更小的区间状态转移而来。
3+
### 1.1 区间动态规划定义
44

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

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /