2 条题解

  • 0
    @ 2026-3-12 18:06:55

    对于动态规划的题目,老规矩,分四步解:

    第一步,把示意图画出来,将问题可视化:

    第二步:找到合适的子问题:

    如图,从第8步开始,每一步等于n-1或来自于n-2,那么子问题就是第到达第i个点有多少条路线。

    第三步:找到子问题直接的关系:

    第i点的路线数量等于点i-a和点i-b的数量的累加。

    第四步:按顺序解决子问题,在这道题目里,按顺序是逆序,而不是顺序。

    #include <iostream>
    #include<iomanip>
    using namespace std;
    int arr[200001];
    int n, a, b, c; //从n减到c,每次减a或减b
    long long  ans = 0;
    int main(){
        cin >> n >> a >> b >> c;
        
        arr[n] = 1; 
        for (int i =n; i > c; i--) {
            if (i - a > c) {
                arr[i - a] += arr[i];
                arr[i - a] %= 1000000007;
            }else
                ans += arr[i];
            if (i - b > c) {
                arr[i - b] += arr[i];
                arr[i - b] %= 1000000007;
            }else
                ans += arr[i];
            ans %= 1000000007;
        }   
        cout << ans;
        return 0;
    }
    
    
    • 1

    信息

    ID
    1860
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者