比较灵活的一种 DP,复杂度比较高。
区间 DP
1. 分类
- 环形 DP 转线性 DP
- 记录方案数
- 区间 DP + 高精度
- 二维区间 DP
2. 例题
T1:[NOI1995] 石子合并
是一个模板题,大致思路是 $f[i][j]= \max(f[i][k]+f[k+1][j])+a[l]r$。
时间复杂度 $O(n^3)$。
不详细讲了。
T2:环形石子合并
和上一题其实没有大区别,只是可以首尾合并。
现在怎么办呢?
首先,我们可以发现,合并完后,一定会有相邻的两个点是没有合并的。
于是,我们可以枚举相邻的两个点,从中间断开,就可以转换成链了。
但是,这个的复杂度为 $O(n\times n^3=n^4)$,会超时。
怎么优化呢?
我们将整个的环断开,复制一倍在末尾。
按链来计算,我们再枚举起点,$f[i][i+n-1]$ 即为答案。
T3:[NOIP2006] 能量项链
可能很多同学都会想到贪心,但是是有问题的。
其实还是一个区间 DP,和上一题没有大区别。
考虑边界问题,有一些不同。
$f[i][j]=\max(f[i][k]+f[k][j]+a[i]a[k]a[j])i<k<j$。
1 |
|
T4:凸多边形的划分
看似无从下手。
现在,我们先考虑对于一条边,我们必须找到一个点来使这条边构成一个三角形。
枚举这个点,我们发现可以将整个图转化为三个部分,于是就划分为了三个子问题。
于是,我们就可以区间 DP 了!
具体来说,我们选取 $[L,R]$ 这条边,然后枚举对应的点,然后划分为 $[L,i],[i,R],(L,i,R)$ 三部分。
最后要注意的是,答案很大,需要使用该精度。
T5:[NOIP2003] 加分二叉树
题目本身不难,但是我们要学习区间 DP 的思想。
我们发现,在中序遍历中,左子树一定会根节点的左边,右子树一定在根节点的右边。
于是,我们可以枚举当前的根节点,然后就可以划分为几个了。
$f[i,j]=\max(f[i][k-1]\times f[k+1][j]+a[k])(i<k<j)$。
同时,我们要记录答案的来源。
1 |
|
T6:[NOI1999] 棋盘分割
首先一阵推导:
于是,我们就是要使 $\sum_{i=1}^nx_i^2$ 最小。
首先,分为横切和纵切。
然后,我们还要看是哪一边继续切割,就递归统计答案。
对于另一边,我们可以使用二维前缀和快速计算。
1 |
|