第二次集训总结
区间DP
区间DP是一类以区间作为状态进行转移的动态规划,由于要对区间进行DP,所以时间复杂度通常为 $O(n^2)$ 、$O(n^3)$ 左右。
在求解时,通常在区间内枚举断点,再合并断点两边的区间以获得最优解。
代码如下:
for (int len=2;len<=n;len++){ //枚举区间长度
for (int i=1;i<=n-len+1;i++){ //枚举左端点
int j=i+len-1; //计算右端点
for (int k=i;k<j;k++){ //枚举断点
dp[i][j]=min(dp[i][k]+dp[k+1][j]+cost(i,j)); //求解最优值
}
}
}
以上代码时间复杂度为 $O(n^3)$
由于朴素区间DP时间复杂度太大,所以以下列举几种常见的优化方法:
- 前缀和优化:在 $O(1)$ 的复杂度内得到区间的和
- 四边形不等式优化:详见OIwiki,虽然用着方便,但证明很复杂