Skip to content

Commit 6363b69

Browse files
authored
feat: add solutions to lcp problem: No.22 (doocs#1532)
No.22.黑白方格画
1 parent 15d1609 commit 6363b69

File tree

6 files changed

+230
-1
lines changed

6 files changed

+230
-1
lines changed

lcp/LCP 22. 黑白方格画/README.md

+126-1
Original file line numberDiff line numberDiff line change
@@ -47,22 +47,147 @@
4747

4848
<!-- 这里可写通用的实现逻辑 -->
4949

50+
**方法一:组合计数**
51+
52+
我们可以选择涂黑 $n$ 行中的任意 $i$ 行,涂黑 $n$ 列中的任意 $j$ 列。那么涂黑的格子数为 $n \times (i + j) - i \times j$。如果满足 $n \times (i + j) - i \times j = k$,则方案数为 $\binom{n}{i} \times \binom{n}{j}$。累加所有满足条件的方案数即可。
53+
54+
注意,如果 $k = n \times n$,则只有一种方案,直接返回 $1$ 即可。
55+
56+
时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。其中 $n$ 是网格的边长。
57+
5058
<!-- tabs:start -->
5159

5260
### **Python3**
5361

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

5664
```python
57-
65+
class Solution:
66+
def paintingPlan(self, n: int, k: int) -> int:
67+
if k == n * n:
68+
return 1
69+
ans = 0
70+
for i in range(n + 1):
71+
for j in range(n + 1):
72+
if n * (i + j) - i * j == k:
73+
ans += comb(n, i) * comb(n, j)
74+
return ans
5875
```
5976

6077
### **Java**
6178

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

6481
```java
82+
class Solution {
83+
public int paintingPlan(int n, int k) {
84+
if (k == n * n) {
85+
return 1;
86+
}
87+
int[][] c = new int[n + 1][n + 1];
88+
for (int i = 0; i <= n; ++i) {
89+
c[i][0] = 1;
90+
for (int j = 1; j <= i; ++j) {
91+
c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
92+
}
93+
}
94+
int ans = 0;
95+
for (int i = 0; i <= n; ++i) {
96+
for (int j = 0; j <= n; ++j) {
97+
if (n * (i + j) - i * j == k) {
98+
ans += c[n][i] * c[n][j];
99+
}
100+
}
101+
}
102+
return ans;
103+
}
104+
}
105+
```
106+
107+
### **C++**
108+
109+
```cpp
110+
class Solution {
111+
public:
112+
int paintingPlan(int n, int k) {
113+
if (k == n * n) {
114+
return 1;
115+
}
116+
int c[n + 1][n + 1];
117+
memset(c, 0, sizeof(c));
118+
for (int i = 0; i <= n; ++i) {
119+
c[i][0] = 1;
120+
for (int j = 1; j <= i; ++j) {
121+
c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
122+
}
123+
}
124+
int ans = 0;
125+
for (int i = 0; i <= n; ++i) {
126+
for (int j = 0; j <= n; ++j) {
127+
if (n * (i + j) - i * j == k) {
128+
ans += c[n][i] * c[n][j];
129+
}
130+
}
131+
}
132+
return ans;
133+
}
134+
};
135+
```
136+
137+
### **Go**
138+
139+
```go
140+
func paintingPlan(n int, k int) (ans int) {
141+
if k == n*n {
142+
return 1
143+
}
144+
c := make([][]int, n+1)
145+
for i := range c {
146+
c[i] = make([]int, n+1)
147+
}
148+
for i := 0; i <= n; i++ {
149+
c[i][0] = 1
150+
for j := 1; j <= i; j++ {
151+
c[i][j] = c[i-1][j] + c[i-1][j-1]
152+
}
153+
}
154+
for i := 0; i <= n; i++ {
155+
for j := 0; j <= n; j++ {
156+
if n*(i+j)-i*j == k {
157+
ans += c[n][i] * c[n][j]
158+
}
159+
}
160+
}
161+
return
162+
}
163+
```
65164

165+
### **TypeScript**
166+
167+
```ts
168+
function paintingPlan(n: number, k: number): number {
169+
if (k === n * n) {
170+
return 1;
171+
}
172+
const c: number[][] = Array(n + 1)
173+
.fill(0)
174+
.map(() => Array(n + 1).fill(0));
175+
for (let i = 0; i <= n; ++i) {
176+
c[i][0] = 1;
177+
for (let j = 1; j <= i; ++j) {
178+
c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
179+
}
180+
}
181+
let ans = 0;
182+
for (let i = 0; i <= n; ++i) {
183+
for (let j = 0; j <= n; ++j) {
184+
if (n * (i + j) - i * j === k) {
185+
ans += c[n][i] * c[n][j];
186+
}
187+
}
188+
}
189+
return ans;
190+
}
66191
```
67192

68193
### **...**
+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
public:
3+
int paintingPlan(int n, int k) {
4+
if (k == n * n) {
5+
return 1;
6+
}
7+
int c[n + 1][n + 1];
8+
memset(c, 0, sizeof(c));
9+
for (int i = 0; i <= n; ++i) {
10+
c[i][0] = 1;
11+
for (int j = 1; j <= i; ++j) {
12+
c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
13+
}
14+
}
15+
int ans = 0;
16+
for (int i = 0; i <= n; ++i) {
17+
for (int j = 0; j <= n; ++j) {
18+
if (n * (i + j) - i * j == k) {
19+
ans += c[n][i] * c[n][j];
20+
}
21+
}
22+
}
23+
return ans;
24+
}
25+
};
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
func paintingPlan(n int, k int) (ans int) {
2+
if k == n*n {
3+
return 1
4+
}
5+
c := make([][]int, n+1)
6+
for i := range c {
7+
c[i] = make([]int, n+1)
8+
}
9+
for i := 0; i <= n; i++ {
10+
c[i][0] = 1
11+
for j := 1; j <= i; j++ {
12+
c[i][j] = c[i-1][j] + c[i-1][j-1]
13+
}
14+
}
15+
for i := 0; i <= n; i++ {
16+
for j := 0; j <= n; j++ {
17+
if n*(i+j)-i*j == k {
18+
ans += c[n][i] * c[n][j]
19+
}
20+
}
21+
}
22+
return
23+
}
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public int paintingPlan(int n, int k) {
3+
if (k == n * n) {
4+
return 1;
5+
}
6+
int[][] c = new int[n + 1][n + 1];
7+
for (int i = 0; i <= n; ++i) {
8+
c[i][0] = 1;
9+
for (int j = 1; j <= i; ++j) {
10+
c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
11+
}
12+
}
13+
int ans = 0;
14+
for (int i = 0; i <= n; ++i) {
15+
for (int j = 0; j <= n; ++j) {
16+
if (n * (i + j) - i * j == k) {
17+
ans += c[n][i] * c[n][j];
18+
}
19+
}
20+
}
21+
return ans;
22+
}
23+
}
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
class Solution:
2+
def paintingPlan(self, n: int, k: int) -> int:
3+
if k == n * n:
4+
return 1
5+
ans = 0
6+
for i in range(n + 1):
7+
for j in range(n + 1):
8+
if n * (i + j) - i * j == k:
9+
ans += comb(n, i) * comb(n, j)
10+
return ans
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
function paintingPlan(n: number, k: number): number {
2+
if (k === n * n) {
3+
return 1;
4+
}
5+
const c: number[][] = Array(n + 1)
6+
.fill(0)
7+
.map(() => Array(n + 1).fill(0));
8+
for (let i = 0; i <= n; ++i) {
9+
c[i][0] = 1;
10+
for (let j = 1; j <= i; ++j) {
11+
c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
12+
}
13+
}
14+
let ans = 0;
15+
for (let i = 0; i <= n; ++i) {
16+
for (let j = 0; j <= n; ++j) {
17+
if (n * (i + j) - i * j === k) {
18+
ans += c[n][i] * c[n][j];
19+
}
20+
}
21+
}
22+
return ans;
23+
}

0 commit comments

Comments
 (0)