(问题已经解决,谢谢大家)
本周双周赛第二题遇到了一点疑惑求解答:
我的代码:(未通过)
class Solution {
private:
const int mod = 1e9+7;
public:
int countGoodStrings(int low, int high, int zero, int one) {
long long ans = 0;
vector<long long> dp(high + 1, 0);
dp[0] = 1;
if (one < zero && zero % one == 0) { // 区别1,根据不同情况给dp[one],dp[zero]初始化
dp[one] = 1;
dp[zero] = 2;
} else if (one < zero && zero % one != 0 || one > zero && one % zero != 0) {
dp[one] = 1;
dp[zero] = 1;
} else if (one > zero && one % zero == 0) {
dp[one] = 2;
dp[zero] = 1;
} else if (one == zero) {
dp[one] = 2;
}
for (int i = min(one, zero) +1; i <= high; i++) { // 区别2
if (i - zero >= 0) dp[i] = (dp[i] + dp[i - zero]) % mod;
if (i - one >= 0) dp[i] = (dp[i] + dp[i - one]) % mod;
}
for (int j = low; j <= high; j++) {
ans = (ans + dp[j]) % mod;
}
return ans;
}
};根据大佬的想法修改后的代码:(通过)
class Solution {
private:
const int mod = 1e9+7;
public:
int countGoodStrings(int low, int high, int zero, int one) {
long long ans = 0;
vector<long long> dp(high + 1, 0);
dp[0] = 1;
for (int i = 1; i <= high; i++) {
if (i - zero >= 0) dp[i] = (dp[i] + dp[i - zero]) % mod;
if (i - one >= 0) dp[i] = (dp[i] + dp[i - one]) % mod;
}
for (int j = low; j <= high; j++) {
ans = (ans + dp[j]) % mod;
}
return ans;
}
};看到本题的第一眼,我就想到了爬楼梯和这题很类似,于是想用动态规划。
但是提交总是错误。
观察我的代码,与正确代码两点不同:
我总想着给dp[one],dp[zero]赋初值。
动态规划的初值从dp[min(one,zero)]+1开始,而前面dp[1] ~ dp[min(one,zero) - 1] 已经初始化未0了不用管,也没有方法构成这种长度的字符串。
请问我的这两点想法哪里有问题?