2466. 统计构造好字符串的方案数

题目链接:

本题其实是爬楼梯这道题的变式。

题目要求长度在 \(\rm low \sim high\) 之间的好字符串个数,那我直接把所有长度的好字符串个数搞出来,再取长度在这个区间的相加就完事了。

\(f[i]\) 表示构造长为 \(i\) 的字符串的方案数,也即长为 \(i\) 的好字符串的个数。看最后一步是走的 \(\rm zero\) 还是 \(\rm one\),若是前者则有 \(\rm f[i-zero]\) 个方案;若是后者则有 \(\rm f[i - one]\) 个方案。所有的方案数即为合法情况下这两种之和。

class Solution {
public:
    int countGoodStrings(int low, int high, int zero, int one) {
        const int MOD = 1e9 + 7;
        vector<int> f(high + 1);
        f[0] = 1;//构造空串的方案数为1,这是一个常用的技巧
        for (int i = 1; i <= high; i++) {
            if (i >= zero) f[i] = (f[i] + f[i - zero]) % MOD;
            if (i >= one) f[i] = (f[i] + f[i - one]) % MOD;
        }
        int res = 0;
        for (int i = low; i <= high; i++) {
            res = (res + f[i]) % MOD;
        }
        return res;
    }
};
posted @ 2024-04-15 16:29  胖柚の工作室  阅读(18)  评论(0)    收藏  举报