1 条题解

  • 0
    @ 2024-6-13 1:59:40

    【题目大意】给定四个整数n,a,b,cn,a,b,c,每次可以执行操作nan-anbn-b,直到ncn​≤ c,求方案数模 10910^9 + 7 的结果。

    【考纲知识点】动态规划

    【解题思路】

    这道题因为n2n ≤ 2*10510^5所以就很自然的想到一种线性 DP 策略:

    n n 枚举到 c+1c+1dp[i]dp[i] 转移到 dp[ia]dp[i-a]dp[ib]dp[i-b] 中 ,状态转移方程就是

    dp[ia]=dp[ia]+dp[i]dp[i-a] = dp[i-a]+dp[i]

    dp[ib]=dp[ib]+dp[i]dp[i-b] = dp[i-b]+dp[i]

    最后还要注意nan-anbn-b为负数的情况还有非常重要的一点,需要取模。

    【参考程序】

    #include <bits/stdc++.h>
    using namespace std;
    const int mod = 1e9 + 7;
    int n, a, b, c, dp[200005];
    int main()
    {
      cin >> n >> a >> b >> c;
      dp[n] = 1; // 初始化
      for (int i = n; i > c; i--)
      {
        if (i - a <= c) // 避免负数情况,将小于等于 c 的 i-a 和 i-b 全部存进 c 中
        {
          dp[c] = (dp[c] + dp[i]) % mod;
        }
        else
        {
          dp[i - a] = (dp[i - a] + dp[i]) % mod;
        }
        if (i - b <= c)
        {
          dp[c] = (dp[c] + dp[i]) % mod;
        }
        else
        {
          dp[i - b] = (dp[i - b] + dp[i]) % mod;
        }
      }
      cout << dp[c];
      return 0;
    }
    
    • 1

    信息

    ID
    650
    时间
    1000ms
    内存
    512MiB
    难度
    8
    标签
    递交数
    16
    已通过
    7
    上传者