动态 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

posted @ 2024-09-11 11:16  wnsyou  阅读(0)  评论(0编辑  收藏  举报