算法
(递推型DP) $O(n)$
状态定义:
dp[i]
: 从第 i
级台阶爬到第 $n$ 级台阶的方案数
状态转移:
$$ dp[i] = dp[i + 1] + dp[i + 2] $$
初始条件:
$$ dp[n] = 1, \ dp[a] = 0 $$
C++ 代码
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using std::cin;
using std::cout;
using std::vector;
int main() {
int n, m;
cin >> n >> m;
vector<bool> broken(n + 1);
rep(i, m) {
int a;
cin >> a;
broken[a] = true;
}
vector<int> dp(n + 2);
const int mod = 1000000007;
dp[n] = 1;
for (int i = n - 1; i >= 0; --i) {
if (!broken[i]) {
dp[i] = (dp[i + 1] + dp[i + 2]) % mod;
}
}
cout << dp[0] << '\n';
return 0;
}