区间DP

高级

区间 DP 是 CSP-S 高频考点,经典问题:石子合并、矩阵链乘。

区间DP

演示区间DP求解石子合并问题的过程。

AlgoAnim · 区间DP

待机

速度
待机
// 源代码
1int intervalDP(vector<int>& a) {
2    int n = a.size();
3    vector<int> prefix(n + 1, 0);
4    for (int i = 0; i < n; i++) prefix[i+1] = prefix[i] + a[i];
5    vector<vector<int>> dp(n, vector<int>(n, 0));
6    for (int len = 2; len <= n; len++)
7        for (int i = 0; i + len - 1 < n; i++) {
8            int j = i + len - 1;
9            dp[i][j] = INT_MAX;
10            for (int k = i; k < j; k++)
11                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j]);
12            dp[i][j] += prefix[j+1] - prefix[i];
13        }
14    return dp[0][n-1];
15}

复杂度分析

时间 O(n³)
空间 O(n²)
最优 O(n³)
最坏 O(n³)

算法讲解

区间 DP 在区间 [i,j] 上定义状态,转移时枚举分割点 k。

经典问题:石子合并(合并相邻两堆的最小代价)。

实现方式:按区间长度从小到大枚举,O(n³) 时间复杂度。

它属于"分治 + DP"的混合策略。