DP优化
# DP 优化
# 单调队列优化 DP
单调队列在 DP 中优化的基本应用,是对这样一类 DP 状态转移方程进行优化
方程的特点是其中关于 的项 和关于 的项 是独立的。 被限制在窗口 内
如果单纯的枚举 ,复杂度为 但是使用单调队列优化可以到
我们假设 的活动窗口为 ,那么发现 和 所对应的 有很大一部分重叠,产生了重复计算,如果我们能减少这些重复计算就能优化复杂度
在 增大的过程中,我们用一个单调队列来维护决策 的最小值,因为对于 来说 可以看成是常量
考虑维护 的最小值,如果一个 比 更靠右并且 那么 就没有存在的意义了,因为 能往后拓展的 要比 多
那么如何取得答案?如果这是一个单调递增的队列,那就取头,如果头部的节点不合法,在 的窗口外,那就再取一个,直到合法为止
# 四边形不等式优化 DP
一些常用的区间 DP 问题的状态转移方程为:
满足以下几个性质时:
- 四边形不等式:设 有, ,包含和 交叉和
- 单调性:设 满足:
DP 转移的最后一层 可以减小范围
for (int len = 1; len <= n; len ++)
for (int i = 1; i + len - 1 <= n; i ++){
int j = i + len - 1;
for (int k = p[i][j-1]; k <= p[i + 1][j]; k ++){
if(dp[i][j] > dp[i][k] + dp[k + 1][j] + w[i][j]){
dp[i][j] = dp[i][k] + dp[k + 1][j] + w[i][j];
p[i][j] = k;
}
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
其中 表示 的决策点
上次更新: 2024/09/14, 12:53:16