Skip to content

Commit b9acdb4

Browse files
committed
feat: add solutions to lc problem: No.1444
No.1444.Number of Ways of Cutting a Pizza
1 parent 59ea62e commit b9acdb4

File tree

9 files changed

+481
-2
lines changed

9 files changed

+481
-2
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@
101101
- [网格图中递增路径的数目](/solution/2300-2399/2328.Number%20of%20Increasing%20Paths%20in%20a%20Grid/README.md) - `DFS``记忆化搜索`
102102
- [翻转游戏 II](/solution/0200-0299/0294.Flip%20Game%20II/README.md) - `DFS``状态压缩``记忆化搜索`
103103
- [统计所有可行路径](/solution/1500-1599/1575.Count%20All%20Possible%20Routes/README.md) - `DFS``记忆化搜索`
104+
- [切披萨的方案数](/solution/1400-1499/1444.Number%20of%20Ways%20of%20Cutting%20a%20Pizza/README.md) - `DFS``记忆化搜索`
104105

105106
<!-- DFS 待补充 -->
106107

README_EN.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ Complete solutions to [LeetCode](https://leetcode.com/problemset/all/), [LCOF](h
9999
- [Number of Increasing Paths in a Grid](/solution/2300-2399/2328.Number%20of%20Increasing%20Paths%20in%20a%20Grid/README.md) - `DFS``Memoization`
100100
- [Flip Game II](/solution/0200-0299/0294.Flip%20Game%20II/README_EN.md) - `DFS``Bitmask``Memoization`
101101
- [Count All Possible Routes](/solution/1500-1599/1575.Count%20All%20Possible%20Routes/README_EN.md) - `DFS``Memoization`
102+
- [Number of Ways of Cutting a Pizza](/solution/1400-1499/1444.Number%20of%20Ways%20of%20Cutting%20a%20Pizza/README_EN.md) - `DFS``Memoization`
102103

103104
### 4. Dynamic Programming(DP)
104105

solution/1400-1499/1444.Number of Ways of Cutting a Pizza/README.md

Lines changed: 166 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,187 @@
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54+
**方法一:二维前缀和 + 记忆化搜索**
55+
56+
时间复杂度 $O(mnk*(m+n))$。
57+
58+
相似题目:[2312. 卖木头块](/solution/2300-2399/2312.Selling%20Pieces%20of%20Wood/README.md)
59+
5460
<!-- tabs:start -->
5561

5662
### **Python3**
5763

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

6066
```python
61-
67+
class Solution:
68+
def ways(self, pizza: List[str], k: int) -> int:
69+
@cache
70+
def dfs(i, j, k):
71+
if k == 0:
72+
return int(s[-1][-1] - s[-1][j] - s[i][-1] + s[i][j] > 0)
73+
res = 0
74+
for x in range(i + 1, m):
75+
if s[x][-1] - s[x][j] - s[i][-1] + s[i][j]:
76+
res += dfs(x, j, k - 1)
77+
for y in range(j + 1, n):
78+
if s[-1][y] - s[-1][j] - s[i][y] + s[i][j]:
79+
res += dfs(i, y, k - 1)
80+
return res % mod
81+
82+
mod = 10**9 + 7
83+
m, n = len(pizza), len(pizza[0])
84+
s = [[0] * (n + 1) for _ in range(m + 1)]
85+
for i, row in enumerate(pizza):
86+
for j, v in enumerate(row):
87+
s[i + 1][j + 1] = s[i + 1][j] + \
88+
s[i][j + 1] - s[i][j] + int(v == 'A')
89+
return dfs(0, 0, k - 1)
6290
```
6391

6492
### **Java**
6593

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

6896
```java
97+
class Solution {
98+
private static final int MOD = (int) 1e9 + 7;
99+
private int[][][] f;
100+
private int[][] s;
101+
private int m;
102+
private int n;
103+
104+
public int ways(String[] pizza, int k) {
105+
m = pizza.length;
106+
n = pizza[0].length();
107+
s = new int[m + 1][n + 1];
108+
f = new int[m][n][k];
109+
for (int i = 0; i < m; ++i) {
110+
for (int j = 0; j < n; ++j) {
111+
s[i + 1][j + 1] = s[i + 1][j] + s[i][j + 1] - s[i][j] + (pizza[i].charAt(j) == 'A' ? 1 : 0);
112+
Arrays.fill(f[i][j], -1);
113+
}
114+
}
115+
return dfs(0, 0, k - 1);
116+
}
117+
118+
private int dfs(int i, int j, int k) {
119+
if (f[i][j][k] != -1) {
120+
return f[i][j][k];
121+
}
122+
if (k == 0) {
123+
return s[m][n] - s[m][j] - s[i][n] + s[i][j] > 0 ? 1 : 0;
124+
}
125+
int res = 0;
126+
for (int x = i + 1; x < m; ++x) {
127+
if (s[x][n] - s[x][j] - s[i][n] + s[i][j] > 0) {
128+
res = (res + dfs(x, j, k - 1)) % MOD;
129+
}
130+
}
131+
for (int y = j + 1; y < n; ++y) {
132+
if (s[m][y] - s[m][j] - s[i][y] + s[i][j] > 0) {
133+
res = (res + dfs(i, y, k - 1)) % MOD;
134+
}
135+
}
136+
f[i][j][k] = res;
137+
return res;
138+
}
139+
}
140+
```
141+
142+
### **C++**
143+
144+
```cpp
145+
class Solution {
146+
public:
147+
const int mod = 1e9 + 7;
148+
vector<vector<vector<int>>> f;
149+
vector<vector<int>> s;
150+
int m;
151+
int n;
152+
153+
int ways(vector<string>& pizza, int k) {
154+
m = pizza.size();
155+
n = pizza[0].size();
156+
s.assign(m + 1, vector<int>(n + 1, 0));
157+
f.assign(m, vector<vector<int>>(n, vector<int>(k, -1)));
158+
for (int i = 0; i < m; ++i)
159+
for (int j = 0; j < n; ++j)
160+
s[i + 1][j + 1] = s[i + 1][j] + s[i][j + 1] - s[i][j] + (pizza[i][j] == 'A');
161+
return dfs(0, 0, k - 1);
162+
}
163+
164+
int dfs(int i, int j, int k) {
165+
if (f[i][j][k] != -1) return f[i][j][k];
166+
if (k == 0) return s[m][n] - s[m][j] - s[i][n] + s[i][j] > 0;
167+
int res = 0;
168+
for (int x = i + 1; x < m; ++x)
169+
if (s[x][n] - s[x][j] - s[i][n] + s[i][j])
170+
res = (res + dfs(x, j, k - 1)) % mod;
171+
for (int y = j + 1; y < n; ++y)
172+
if (s[m][y] - s[m][j] - s[i][y] + s[i][j])
173+
res = (res + dfs(i, y, k - 1)) % mod;
174+
f[i][j][k] = res;
175+
return res;
176+
}
177+
};
178+
```
69179
180+
### **Go**
181+
182+
```go
183+
func ways(pizza []string, k int) int {
184+
mod := int(1e9) + 7
185+
m, n := len(pizza), len(pizza[0])
186+
f := make([][][]int, m)
187+
s := make([][]int, m+1)
188+
for i := range f {
189+
f[i] = make([][]int, n)
190+
for j := range f[i] {
191+
f[i][j] = make([]int, k)
192+
for h := range f[i][j] {
193+
f[i][j][h] = -1
194+
}
195+
}
196+
}
197+
for i := range s {
198+
s[i] = make([]int, n+1)
199+
}
200+
for i, p := range pizza {
201+
for j, v := range p {
202+
s[i+1][j+1] = s[i+1][j] + s[i][j+1] - s[i][j]
203+
if v == 'A' {
204+
s[i+1][j+1]++
205+
}
206+
}
207+
}
208+
var dfs func(int, int, int) int
209+
dfs = func(i, j, k int) int {
210+
if f[i][j][k] != -1 {
211+
return f[i][j][k]
212+
}
213+
if k == 0 {
214+
if s[m][n]-s[m][j]-s[i][n]+s[i][j] > 0 {
215+
return 1
216+
}
217+
return 0
218+
}
219+
res := 0
220+
for x := i + 1; x < m; x++ {
221+
if s[x][n]-s[x][j]-s[i][n]+s[i][j] > 0 {
222+
res = (res + dfs(x, j, k-1)) % mod
223+
}
224+
}
225+
for y := j + 1; y < n; y++ {
226+
if s[m][y]-s[m][j]-s[i][y]+s[i][j] > 0 {
227+
res = (res + dfs(i, y, k-1)) % mod
228+
}
229+
}
230+
f[i][j][k] = res
231+
return res
232+
}
233+
return dfs(0, 0, k-1)
234+
}
70235
```
71236

72237
### **...**

solution/1400-1499/1444.Number of Ways of Cutting a Pizza/README_EN.md

Lines changed: 160 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,172 @@
6565
### **Python3**
6666

6767
```python
68-
68+
class Solution:
69+
def ways(self, pizza: List[str], k: int) -> int:
70+
@cache
71+
def dfs(i, j, k):
72+
if k == 0:
73+
return int(s[-1][-1] - s[-1][j] - s[i][-1] + s[i][j] > 0)
74+
res = 0
75+
for x in range(i + 1, m):
76+
if s[x][-1] - s[x][j] - s[i][-1] + s[i][j]:
77+
res += dfs(x, j, k - 1)
78+
for y in range(j + 1, n):
79+
if s[-1][y] - s[-1][j] - s[i][y] + s[i][j]:
80+
res += dfs(i, y, k - 1)
81+
return res % mod
82+
83+
mod = 10**9 + 7
84+
m, n = len(pizza), len(pizza[0])
85+
s = [[0] * (n + 1) for _ in range(m + 1)]
86+
for i, row in enumerate(pizza):
87+
for j, v in enumerate(row):
88+
s[i + 1][j + 1] = s[i + 1][j] + \
89+
s[i][j + 1] - s[i][j] + int(v == 'A')
90+
return dfs(0, 0, k - 1)
6991
```
7092

7193
### **Java**
7294

7395
```java
96+
class Solution {
97+
private static final int MOD = (int) 1e9 + 7;
98+
private int[][][] f;
99+
private int[][] s;
100+
private int m;
101+
private int n;
102+
103+
public int ways(String[] pizza, int k) {
104+
m = pizza.length;
105+
n = pizza[0].length();
106+
s = new int[m + 1][n + 1];
107+
f = new int[m][n][k];
108+
for (int i = 0; i < m; ++i) {
109+
for (int j = 0; j < n; ++j) {
110+
s[i + 1][j + 1] = s[i + 1][j] + s[i][j + 1] - s[i][j] + (pizza[i].charAt(j) == 'A' ? 1 : 0);
111+
Arrays.fill(f[i][j], -1);
112+
}
113+
}
114+
return dfs(0, 0, k - 1);
115+
}
116+
117+
private int dfs(int i, int j, int k) {
118+
if (f[i][j][k] != -1) {
119+
return f[i][j][k];
120+
}
121+
if (k == 0) {
122+
return s[m][n] - s[m][j] - s[i][n] + s[i][j] > 0 ? 1 : 0;
123+
}
124+
int res = 0;
125+
for (int x = i + 1; x < m; ++x) {
126+
if (s[x][n] - s[x][j] - s[i][n] + s[i][j] > 0) {
127+
res = (res + dfs(x, j, k - 1)) % MOD;
128+
}
129+
}
130+
for (int y = j + 1; y < n; ++y) {
131+
if (s[m][y] - s[m][j] - s[i][y] + s[i][j] > 0) {
132+
res = (res + dfs(i, y, k - 1)) % MOD;
133+
}
134+
}
135+
f[i][j][k] = res;
136+
return res;
137+
}
138+
}
139+
```
140+
141+
### **C++**
142+
143+
```cpp
144+
class Solution {
145+
public:
146+
const int mod = 1e9 + 7;
147+
vector<vector<vector<int>>> f;
148+
vector<vector<int>> s;
149+
int m;
150+
int n;
151+
152+
int ways(vector<string>& pizza, int k) {
153+
m = pizza.size();
154+
n = pizza[0].size();
155+
s.assign(m + 1, vector<int>(n + 1, 0));
156+
f.assign(m, vector<vector<int>>(n, vector<int>(k, -1)));
157+
for (int i = 0; i < m; ++i)
158+
for (int j = 0; j < n; ++j)
159+
s[i + 1][j + 1] = s[i + 1][j] + s[i][j + 1] - s[i][j] + (pizza[i][j] == 'A');
160+
return dfs(0, 0, k - 1);
161+
}
162+
163+
int dfs(int i, int j, int k) {
164+
if (f[i][j][k] != -1) return f[i][j][k];
165+
if (k == 0) return s[m][n] - s[m][j] - s[i][n] + s[i][j] > 0;
166+
int res = 0;
167+
for (int x = i + 1; x < m; ++x)
168+
if (s[x][n] - s[x][j] - s[i][n] + s[i][j])
169+
res = (res + dfs(x, j, k - 1)) % mod;
170+
for (int y = j + 1; y < n; ++y)
171+
if (s[m][y] - s[m][j] - s[i][y] + s[i][j])
172+
res = (res + dfs(i, y, k - 1)) % mod;
173+
f[i][j][k] = res;
174+
return res;
175+
}
176+
};
177+
```
74178
179+
### **Go**
180+
181+
```go
182+
func ways(pizza []string, k int) int {
183+
mod := int(1e9) + 7
184+
m, n := len(pizza), len(pizza[0])
185+
f := make([][][]int, m)
186+
s := make([][]int, m+1)
187+
for i := range f {
188+
f[i] = make([][]int, n)
189+
for j := range f[i] {
190+
f[i][j] = make([]int, k)
191+
for h := range f[i][j] {
192+
f[i][j][h] = -1
193+
}
194+
}
195+
}
196+
for i := range s {
197+
s[i] = make([]int, n+1)
198+
}
199+
for i, p := range pizza {
200+
for j, v := range p {
201+
s[i+1][j+1] = s[i+1][j] + s[i][j+1] - s[i][j]
202+
if v == 'A' {
203+
s[i+1][j+1]++
204+
}
205+
}
206+
}
207+
var dfs func(int, int, int) int
208+
dfs = func(i, j, k int) int {
209+
if f[i][j][k] != -1 {
210+
return f[i][j][k]
211+
}
212+
if k == 0 {
213+
if s[m][n]-s[m][j]-s[i][n]+s[i][j] > 0 {
214+
return 1
215+
}
216+
return 0
217+
}
218+
res := 0
219+
for x := i + 1; x < m; x++ {
220+
if s[x][n]-s[x][j]-s[i][n]+s[i][j] > 0 {
221+
res = (res + dfs(x, j, k-1)) % mod
222+
}
223+
}
224+
for y := j + 1; y < n; y++ {
225+
if s[m][y]-s[m][j]-s[i][y]+s[i][j] > 0 {
226+
res = (res + dfs(i, y, k-1)) % mod
227+
}
228+
}
229+
f[i][j][k] = res
230+
return res
231+
}
232+
return dfs(0, 0, k-1)
233+
}
75234
```
76235

77236
### **...**

0 commit comments

Comments
 (0)