BZOJ_1009 GT考试

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)* 的复杂度里解决。

点击查看代码

你可能感兴趣的:(BZOJ_1009 GT考试)