动态 dp
max(min)-plus 矩阵运算
前置知识:矩阵运算
引入
在之前的矩阵运算里,我们可以将两个矩阵相乘来得到一个新的矩阵,这可以让我们在 \(O(\log n)\) 处理出一些特殊的 dp[n]
。
但这些 dp 都有一个共同特征:不包含 max/min。
那么假如状态转移方程中有 max/min,该如何优化呢?
更改矩阵运算规则
我们把矩阵乘法的规则更改一下:
matrix operator * (matrix y) {
matrix z;
z.n = n, z.m = y.m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= y.m; j++) {
z.a[i][j] = -INF;
for (int k = 1; k <= m; k++)
z.a[i][j] = max(z.a[i][j], a[i][k] + y.a[k][j]);
}
return z;
}
同样也满足各种性质。
那么如果不可转移,就在矩阵对应位置赋极大/极小值,做快速幂即可。
动态 dp
利用矩阵运算和线段树维护动态 dp。
例题:contest