动态规划做法:

上第一个台阶有1种上法

上第二个台阶有2种上法(1+1或2)

接下来的每个台阶都可以通过前两个台阶的上法数量得到(因为最大只能上两个台阶),无论是动态规划还是递归都满足这种条件。

dp[i]表示第i个台阶有几种上法

状态转移方程: dp[i] = dp[i-1] + dp[i-2]

最后dp[n]为结果。

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n,mod=998244353;
    cin>>n;
    vector<int> dp(n+1,0);
    dp[1]=1;
    dp[2]=2;
    for(int i=3;i<=n;++i) dp[i]=(dp[i-1]+dp[i-2])%mod;
    cout<<dp[n];
}