# 🌱 Lời giải Mely Educational Contest 04 bài F :Tí và Tèo.
>[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:
+ Ta gọi $dp[i][v]$ là số cách để tạo ra mảng đến vị trí thứ $i$ và giá trị của $X_i = v$.
+ Ta đặt một trường hợp ảo tại ví trí $0$, nhận xét tại vị trí $0$ giá trị $X_0$ có thể thay thế bằng bất kỳ giá trị nào **(tức là $dp[0][v] = 1$ với mọi $v$)**
+ Bây giờ với tất cả vị trí $i>0$. Nếu $x_i = 0$, chúng ta có thể thay thế nó bằng bất kỳ giá trị nào. Tuy nhiên, nếu chúng ta thay thế nó bằng $v$ thì giá trị trước đó phải là $v-1$, $v$ hoặc $v+1$. Do đó, số cách để tạo ra mảng đến vị trí $i$, là tổng của số lượng mảng tạo ra đến vị trí $i-1$ có giá trị kết thúc trước đó là $v-1$, $v$ và $v+1$. Nếu $x_i = v$ từ đầu vào thì chỉ cho phép $dp[i][v]$ **(tức là $dp[i][j] = 0$ nếu $j ≠v$)**. Nếu không thì vẫn là $dp[i][v] = dp[i-1][v-1] + dp[i-1][v] + dp[i-1][v+1]$.
## Code mẫu :bulb:
> **Time:** $O(n.m)$
> **Space:** $O(n.m)$
> **Algo:** Dynamic programing.
> [color=lightgreen]
:::success
:::spoiler code của LeThanhMinh
``` cpp
#include <bits/stdc++.h>
using namespace std;
int main() {
int mod = 1e9+7;
int n, m;
cin >> n >> m;
vector<vector<int>> dp(n,vector<int>(m+1,0));
int x0;
cin >> x0;
if (x0 == 0) {
fill(dp[0].begin(), dp[0].end(), 1);
} else {
dp[0][x0] = 1;
}
for (int i = 1; i < n; i++) {
int x;
cin >> x;
if (x == 0) {
for (int j = 1; j <= m; j++) {
for (int k : {j-1,j,j+1}) {
if (k >= 1 && k <= m) {
(dp[i][j] += dp[i-1][k]) %= mod;
}
}
}
} else {
for (int k : {x-1,x,x+1}) {
if (k >= 1 && k <= m) {
(dp[i][x] += dp[i-1][k]) %= mod;
}
}
}
}
int ans = 0;
for (int j = 1; j <= m; j++) {
(ans += dp[n-1][j]) %= mod;
}
cout << ans << endl;
}
```
:::success