# 🌱 Lời giải Mely Educational Contest 04 bài D : Leo cầu thang.
>[color=pink] Nếu bạn cảm thấy Edit này chất lượng tiếc gì một upvote và giới thiệu team với mọi người nhé :heart:
###### 📋 Content:
[TOC]
____
## Nhận xét :label:
:question: Đây là bài quy hoạch động cơ bản với công thức chuyển trạng thái như sau :
>[color=green]
>- Gọi $dp_i$ là số cách leo được lên bậc thang thứ ***i***
>- Nếu bậc thứ ***i*** bị hỏng thì $dp_i$ ***= 0***
>- Ngược lại $dp_i$ = ($dp_{i-1}$ + $dp_{i-2}$) % $(10^9+7)$ (do bậc thang thứ ***i*** có thể leo lên được từ bậc thang thứ ***i-1*** hoặc ***i-2***), **lưu ý nhỏ** : trường hợp i = 1.
## Code mẫu :bulb:
> **Time:** $O(n)$
> **Space:** $O(n)$
> **Algo:** Dynamic programing.
> [color=lightgreen]
:::success
:::spoiler code mẫu
``` cpp
#include<bits/stdc++.h>
#define pii pair<int,int>
#define fi first
#define se second
#define int long long
using namespace std;
using ll = long long;
const int maxN = 2e5 + 5;
const int N = 2e6;
const int mod = 1e9 + 7;
int n,m;
int dp[maxN];
int invalid[maxN];
void Solve()
{
cin >> n >> m;
for(int i = 1;i <= m;i++)
{
int x;
cin >> x;
invalid[x] = 1;
}
dp[0] = 1;
for(int i = 1;i <= n;i++)
{
if(invalid[i]) continue;
dp[i] = (dp[i] + dp[i-1]) % mod;
if(i >= 2) dp[i] = (dp[i] + dp[i-2]) % mod;
}
cout << dp[n];
}
int32_t main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
//Prepare();
int tt;
//cin >> tt;
tt = 1;
while(tt--)
{
Solve();
}
}
```
:::success