[集训整理]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,易得递推公式:
于是上来二话不说颓了个柿子:
但是因为模数 \(p\) 不是质数(专门卡了数学做法 QwQ),导致上式不可直接算,于是暴力 \(\to 30pts.\)
那么再回到原本的递推方程,容易让人联想到 矩阵快速幂。
易得 \(A\) 为
于是矩阵快速幂即可。
#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.}\)