1 solutions

  • 1
    @ 2024-8-28 22:38:22
    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 105;
    
    int n, m, cnt;
    int query[N];
    long long f[N];
    
    int main() {
        while(cin >> m, m) {
            n = max(n, m);
            query[cnt ++ ] = m;
        }
        f[1] = 1, f[2] = 2, f[3] = 4;
        for(int i = 4; i <= n; i ++ ) f[i] = f[i - 1] + f[i - 2] + f[i - 3];
        for(int i = 0; i < cnt; i ++ ) cout << f[query[i]] << endl;
        return 0;
    }
    
    我们可以枚举一下每个状态是由那些状态转移过来的
    
    题目给了明确的暗示,
    说了可以从第i层可以从第i-1,i-2,i-3层到达
    那就说明对于所有关于从第i-1,i-2,i-3层
    的跳法可以被沿用到第i层
    所以就得到了状态转移方程f[i] = f[i - 1] + f[i - 2] + f[ - 3];
    这题可以加点小优化,我们存储一下所有的询问
    然后找一下最大要跳的层数
    然后先预处理的一下, 剩下的就是对于所有的询问查表就可以了
    然后这题的范围是70多, 通常到30, 40 左右就会超出int的最大范围, 所以对于这题我们要开long long
    
    • 1

    Information

    ID
    417
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    10
    Tags
    # Submissions
    2
    Accepted
    1
    Uploaded By