[集训整理]QBXT - DP - DAY3

#1.0 简单整理

#1.1 TOPIC

  • 使用数据结构优化(单调队列、线段树、树状数组等)
  • 决策单调性优化
  • 斜率优化
  • 四边形不等式优化
  • 矩阵快速幂优化

#1.2 单调队列优化

对于形如 \(f_i = \max_k(f'_k ) + g_i\) 的方程,且 \(k\) 的取值范围有限制 (一般为 \(i\)\(i\) 之前的若干个),则可以通过单调队列进行优化。 若存在 \(j < k\)\(f'_j \leq f'_k\),则只要 \(k\) 是合法的,无论何种情况下 \(k\) 一定比 \(j\) 要优,那么可能成为答案的值一定是单调下降的。维护 这个单调下降的队列就可以达到 \(O(1)\) 转移。

#1.3 斜率优化

形如 \(f_i =\min\{a_ix_j+y_j\}\),考虑斜率优化。

#1.x 1D/1D DP 优化

1D/1D DP 指的是状态数 \(O(n)\),每个状态的决策量 \(O(n)\) 的 DP。 该种 DP 的朴素做法一般为 \(O(n^2)\)

可采用:

  • 单调队列
  • 斜率优化

等方式进行优化

#2.0 下午考试

#2.1 T1

看到 T1,易得递推公式:

\[f_n=x\cdot f_{n-1}+n, \]

于是上来二话不说颓了个柿子:

\[f_n=\sum_{i=1}^n i x^{n - i} = \dfrac{x (x^n - 1) + n (1-x)}{(x - 1)^2} \]

但是因为模数 \(p\) 不是质数(专门卡了数学做法 QwQ),导致上式不可直接算,于是暴力 \(\to 30pts.\)

那么再回到原本的递推方程,容易让人联想到 矩阵快速幂

\[\begin{pmatrix}f_{n-1}&n-1&1\end{pmatrix}\begin{pmatrix}a_{11}&a_{12}&a_{13}\\ a_{21}&a_{22}&a_{23}\\a_{31}&a_{32}&a_{33}\end{pmatrix}=\begin{pmatrix}f_{n}&n&1\end{pmatrix}. \]

易得 \(A\)

\[\begin{pmatrix}x&0&0\\1&1&0\\1&1&1\end{pmatrix} \]

于是矩阵快速幂即可。

#2.2 T2

暴力 \(\to50\ pts.\)

数位DP \(\to 80\ pts.\)

首先考虑贪心,因为要求最小的数,所以可以从低位到高位,每一位由小到大枚举。

设计 \(f_i\) 表示 \(\bmod k=i\) 时的最小数,按贪心策略进行枚举转移即可。

BFS 优化 \(\to100\ pts.\)

上面数位 DP 不能过的原因是答案位数可能很大,而根据上面的策略,我们每次只需要保存 \(\bmod k\) 同余的数中最小的一个即可,那么考虑将整个过程看作一张图,每个节点存储一个数字,保存前驱结点,然后用 BFS 进行搜索,每次加入队列的数便是当前数 \(v\cdot 10+[0,9]\) 中的一个数,如果之前没有与该数同余的数(上一个数 \(\bmod k\) 得到的余数 \(\times 10+[0,9]\)\(\bmod k\) 得到的数即为这个数 \(\bmod k\) 的余数),就将这个新数加入队列。第一次找到 \(\bmod k =0\) 的数即得答案。

因为保存了前驱结点,倒序输出即可。

#2.3 T3

\(\text{To Be Continued.}\)

posted @ 2021-05-06 18:55  Dfkuaid  阅读(46)  评论(0编辑  收藏  举报