---
# System prepended metadata

title: "\U0001F331 Lời giải Mely Educational Contest 04 bài D : Leo cầu thang."

---

# 🌱 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