题目链接:
本题其实是爬楼梯这道题的变式。
题目要求长度在 \(\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;
}
};
标签:方案,2466,int,构造,high,zero,字符串,rm
From: https://www.cnblogs.com/pangyou3s/p/18136304