一、什么是区间 DP
区间 DP 是在一个区间 [i, j] 上定义状态,通过枚举分割点 k 将大区间拆分为两个小区间来转移的 DP 模型。
核心特征:
- 状态:
dp[i][j]表示区间[i, j]的最优值 - 转移:枚举分割点
k,dp[i][j] = f(dp[i][k], dp[k+1][j]) - 遍历顺序:按区间长度从小到大
Mermaid · 渲染中(下方为源码)
graph TD A["dp[i][j]"] --> B["dp[i][k]"] A --> C["dp[k+1][j]"] B --> D["更小区间..."] C --> E["更小区间..."]
二、通用模板
// 初始化:长度为 1 的区间
for (int i = 0; i < n; i++) dp[i][i] = baseValue;
// 按长度从小到大枚举
for (int len = 2; len <= n; len++) {
for (int i = 0; i + len - 1 < n; i++) {
int j = i + len - 1;
dp[i][j] = INF; // 或 0,取决于求 min 还是 max
for (int k = i; k < j; k++) {
dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k+1][j] + cost);
}
}
}- 时间:O(n³),:O(n²)