Giả sử chúng ta có hai hình dạng, Domino và Tromino. Dominos có hình dạng 2 x 1 và Trominos có hình dạng giống như chữ ‘L’. Chúng có thể được xoay như dưới đây -
Nếu chúng ta có một số n, chúng ta phải tìm số cấu hình để điền vào một bảng 2 x n với hai loại mảnh này. Như chúng ta đã biết trong việc lát gạch, mọi ô vuông đều phải được lát gạch.
Vì vậy, nếu đầu vào là 3, thì đầu ra sẽ là 5. Vì vậy, cách sắp xếp có thể là [XYZ XXZ XYY XXY XYY] và [XYZ YYZ XZZ XYY XXY], ở đây các chữ cái khác nhau được sử dụng cho các ô khác nhau.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
Tạo một mảng có tên dp có kích thước N + 5, đặt dp [1]:=1, dp [2]:=2 và dp [3]:=5
-
cho tôi trong phạm vi 4 đến N
-
dp [i]:=2 * dp [i - 1] + dp [i - 3]
-
-
trả về dp [N]
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#include <bits/stdc++.h> using namespace std; const int MOD = 1e9 + 7; int add(int a, int b){ return ((a % MOD) + (b % MOD)) % MOD; } class Solution { public: int solve(int N) { vector <int> dp(N + 5); dp[1] = 1; dp[2] = 2; dp[3] = 5; for(int i = 4; i <= N; i++){ dp[i] = add(2 * dp[i − 1], dp[i − 3]); } return dp[N]; } }; main(){ Solution ob; cout << (ob.solve(3)); }
Đầu vào
3
Đầu ra
5