1.题目相关
-
标签:
DP
矩阵乘法
KMP
- 题目地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1009
- 题目大意:中文题。
2.思路
比较基础的矩阵乘法加速动态规划。
令 f[i][j] 表示到 i 位,且当前后缀与不吉利串匹配到第 j 位的方案数。
其中 pre[k][j] 表示从匹配 k 位的串加一个字符后变为匹配了 j 位的方案数。
但它的时间复杂度为 O(nm) 难以接受,所以考虑优化。
可以观察到转移方程是一个线性齐次递推式,所以可以用矩阵乘法来加速。
至于构造这个矩阵可以用 KMP 来进行。
void prep() {
int j = 0;
for (int i = 2; i <= m; i++) {
while (j > 0 && a[j+1] != a[i]) j = next[j];
if (a[j+1] == a[i]) j++;
next[i] = j;
}
for (int i = 0; i < m; i++) {
for (int j = 0; j <= 9; j++) {
int k = i;
while (k > 0 && a[k+1] != j) k = next[k];
if (a[k+1] == j) k++;
if (k < m) pre[i][k] = (pre[i][k]+1)%MOD; //由i位转移到k位的方案++.
}
}
mt[0][0] = 1; //f[0][0]的方案数为1.
}
至此本题就可以在 O(logNM^3)* 的复杂度里解决。
网友评论
while (n) {
if (n&1) mul(mt, pre, mt);
mul(pre, pre, pre);
n >>= 1;
}
吗?