Skip to content

Commit 92b4e76

Browse files
committed
feat: add solutions to lc problem: No.0790
No.0790.Domino and Tromino Tiling
1 parent 7e2ec68 commit 92b4e76

File tree

6 files changed

+243
-0
lines changed

6 files changed

+243
-0
lines changed

solution/0700-0799/0790.Domino and Tromino Tiling/README.md

+90
Original file line numberDiff line numberDiff line change
@@ -45,22 +45,112 @@
4545

4646
<!-- 这里可写通用的实现逻辑 -->
4747

48+
**方法一:动态规划**
49+
4850
<!-- tabs:start -->
4951

5052
### **Python3**
5153

5254
<!-- 这里可写当前语言的特殊实现逻辑 -->
5355

5456
```python
57+
class Solution:
58+
def numTilings(self, n: int) -> int:
59+
@cache
60+
def dfs(i, j):
61+
if i > n or j > n:
62+
return 0
63+
if i == n and j == n:
64+
return 1
65+
ans = 0
66+
if i == j:
67+
ans = dfs(i + 2, j + 2) + dfs(i + 1, j + 1) + dfs(i + 2, j + 1) + dfs(i + 1, j + 2)
68+
elif i > j:
69+
ans = dfs(i, j + 2) + dfs(i + 1, j + 2)
70+
else:
71+
ans = dfs(i + 2, j) + dfs(i + 2, j + 1)
72+
return ans % mod
73+
74+
mod = 10**9 + 7
75+
return dfs(0, 0)
76+
```
5577

78+
```python
79+
class Solution:
80+
def numTilings(self, n: int) -> int:
81+
f = [1, 0, 0, 0]
82+
mod = 10**9 + 7
83+
for i in range(1, n + 1):
84+
g = [0] * 4
85+
g[0] = (f[0] + f[1] + f[2] + f[3]) % mod
86+
g[1] = (f[2] + f[3]) % mod
87+
g[2] = (f[1] + f[3]) % mod
88+
g[3] = f[0]
89+
f = g
90+
return f[0]
5691
```
5792

5893
### **Java**
5994

6095
<!-- 这里可写当前语言的特殊实现逻辑 -->
6196

6297
```java
98+
class Solution {
99+
public int numTilings(int n) {
100+
long[] f = {1, 0, 0, 0};
101+
int mod = (int) 1e9 + 7;
102+
for (int i = 1; i <= n; ++i) {
103+
long[] g = new long[4];
104+
g[0] = (f[0] + f[1] + f[2] + f[3]) % mod;
105+
g[1] = (f[2] + f[3]) % mod;
106+
g[2] = (f[1] + f[3]) % mod;
107+
g[3] = f[0];
108+
f = g;
109+
}
110+
return (int) f[0];
111+
}
112+
}
113+
```
114+
115+
### **C++**
116+
117+
```cpp
118+
class Solution {
119+
public:
120+
const int mod = 1e9 + 7;
121+
122+
int numTilings(int n) {
123+
long f[4] = {1, 0, 0, 0};
124+
for (int i = 1; i <= n; ++i) {
125+
long g[4] = {0, 0, 0, 0};
126+
g[0] = (f[0] + f[1] + f[2] + f[3]) % mod;
127+
g[1] = (f[2] + f[3]) % mod;
128+
g[2] = (f[1] + f[3]) % mod;
129+
g[3] = f[0];
130+
memcpy(f, g, sizeof(g));
131+
}
132+
return f[0];
133+
}
134+
};
135+
```
63136

137+
### **Go**
138+
139+
```go
140+
func numTilings(n int) int {
141+
f := [4]int{}
142+
f[0] = 1
143+
const mod int = 1e9 + 7
144+
for i := 1; i <= n; i++ {
145+
g := [4]int{}
146+
g[0] = (f[0] + f[1] + f[2] + f[3]) % mod
147+
g[1] = (f[2] + f[3]) % mod
148+
g[2] = (f[1] + f[3]) % mod
149+
g[3] = f[0]
150+
f = g
151+
}
152+
return f[0]
153+
}
64154
```
65155

66156
### **...**

solution/0700-0799/0790.Domino and Tromino Tiling/README_EN.md

+88
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,101 @@
4040
### **Python3**
4141

4242
```python
43+
class Solution:
44+
def numTilings(self, n: int) -> int:
45+
@cache
46+
def dfs(i, j):
47+
if i > n or j > n:
48+
return 0
49+
if i == n and j == n:
50+
return 1
51+
ans = 0
52+
if i == j:
53+
ans = dfs(i + 2, j + 2) + dfs(i + 1, j + 1) + dfs(i + 2, j + 1) + dfs(i + 1, j + 2)
54+
elif i > j:
55+
ans = dfs(i, j + 2) + dfs(i + 1, j + 2)
56+
else:
57+
ans = dfs(i + 2, j) + dfs(i + 2, j + 1)
58+
return ans % mod
59+
60+
mod = 10**9 + 7
61+
return dfs(0, 0)
62+
```
4363

64+
```python
65+
class Solution:
66+
def numTilings(self, n: int) -> int:
67+
f = [1, 0, 0, 0]
68+
mod = 10**9 + 7
69+
for i in range(1, n + 1):
70+
g = [0] * 4
71+
g[0] = (f[0] + f[1] + f[2] + f[3]) % mod
72+
g[1] = (f[2] + f[3]) % mod
73+
g[2] = (f[1] + f[3]) % mod
74+
g[3] = f[0]
75+
f = g
76+
return f[0]
4477
```
4578

4679
### **Java**
4780

4881
```java
82+
class Solution {
83+
public int numTilings(int n) {
84+
long[] f = {1, 0, 0, 0};
85+
int mod = (int) 1e9 + 7;
86+
for (int i = 1; i <= n; ++i) {
87+
long[] g = new long[4];
88+
g[0] = (f[0] + f[1] + f[2] + f[3]) % mod;
89+
g[1] = (f[2] + f[3]) % mod;
90+
g[2] = (f[1] + f[3]) % mod;
91+
g[3] = f[0];
92+
f = g;
93+
}
94+
return (int) f[0];
95+
}
96+
}
97+
```
98+
99+
### **C++**
100+
101+
```cpp
102+
class Solution {
103+
public:
104+
const int mod = 1e9 + 7;
105+
106+
int numTilings(int n) {
107+
long f[4] = {1, 0, 0, 0};
108+
for (int i = 1; i <= n; ++i) {
109+
long g[4] = {0, 0, 0, 0};
110+
g[0] = (f[0] + f[1] + f[2] + f[3]) % mod;
111+
g[1] = (f[2] + f[3]) % mod;
112+
g[2] = (f[1] + f[3]) % mod;
113+
g[3] = f[0];
114+
memcpy(f, g, sizeof(g));
115+
}
116+
return f[0];
117+
}
118+
};
119+
```
49120

121+
### **Go**
122+
123+
```go
124+
func numTilings(n int) int {
125+
f := [4]int{}
126+
f[0] = 1
127+
const mod int = 1e9 + 7
128+
for i := 1; i <= n; i++ {
129+
g := [4]int{}
130+
g[0] = (f[0] + f[1] + f[2] + f[3]) % mod
131+
g[1] = (f[2] + f[3]) % mod
132+
g[2] = (f[1] + f[3]) % mod
133+
g[3] = f[0]
134+
f = g
135+
}
136+
return f[0]
137+
}
50138
```
51139

52140
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public:
3+
const int mod = 1e9 + 7;
4+
5+
int numTilings(int n) {
6+
long f[4] = {1, 0, 0, 0};
7+
for (int i = 1; i <= n; ++i) {
8+
long g[4] = {0, 0, 0, 0};
9+
g[0] = (f[0] + f[1] + f[2] + f[3]) % mod;
10+
g[1] = (f[2] + f[3]) % mod;
11+
g[2] = (f[1] + f[3]) % mod;
12+
g[3] = f[0];
13+
memcpy(f, g, sizeof(g));
14+
}
15+
return f[0];
16+
}
17+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
func numTilings(n int) int {
2+
f := [4]int{}
3+
f[0] = 1
4+
const mod int = 1e9 + 7
5+
for i := 1; i <= n; i++ {
6+
g := [4]int{}
7+
g[0] = (f[0] + f[1] + f[2] + f[3]) % mod
8+
g[1] = (f[2] + f[3]) % mod
9+
g[2] = (f[1] + f[3]) % mod
10+
g[3] = f[0]
11+
f = g
12+
}
13+
return f[0]
14+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution {
2+
public int numTilings(int n) {
3+
long[] f = {1, 0, 0, 0};
4+
int mod = (int) 1e9 + 7;
5+
for (int i = 1; i <= n; ++i) {
6+
long[] g = new long[4];
7+
g[0] = (f[0] + f[1] + f[2] + f[3]) % mod;
8+
g[1] = (f[2] + f[3]) % mod;
9+
g[2] = (f[1] + f[3]) % mod;
10+
g[3] = f[0];
11+
f = g;
12+
}
13+
return (int) f[0];
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution:
2+
def numTilings(self, n: int) -> int:
3+
@cache
4+
def dfs(i, j):
5+
if i > n or j > n:
6+
return 0
7+
if i == n and j == n:
8+
return 1
9+
ans = 0
10+
if i == j:
11+
ans = dfs(i + 2, j + 2) + dfs(i + 1, j + 1) + dfs(i + 2, j + 1) + dfs(i + 1, j + 2)
12+
elif i > j:
13+
ans = dfs(i, j + 2) + dfs(i + 1, j + 2)
14+
else:
15+
ans = dfs(i + 2, j) + dfs(i + 2, j + 1)
16+
return ans % mod
17+
18+
mod = 10**9 + 7
19+
return dfs(0, 0)

0 commit comments

Comments
 (0)