求教|本周双周赛Q2
1493
2022.11.12
2022.11.12
发布于 未知归属地

(问题已经解决,谢谢大家)

本周双周赛第二题遇到了一点疑惑求解答:
我的代码:(未通过)

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;
    }
};

看到本题的第一眼,我就想到了爬楼梯和这题很类似,于是想用动态规划。
但是提交总是错误。
观察我的代码,与正确代码两点不同:

  1. 我总想着给dp[one],dp[zero]赋初值。

  2. 动态规划的初值从dp[min(one,zero)]+1开始,而前面dp[1] ~ dp[min(one,zero) - 1] 已经初始化未0了不用管,也没有方法构成这种长度的字符串。

请问我的这两点想法哪里有问题?

评论 (14)