1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
impl Solution {
pub fn ways(pizza: Vec<String>, k: i32) -> i32 {
let mod_val = 1_000_000_007;
let rows = pizza.len();
let cols = pizza[0].len();
let mut apples = vec![vec![0; cols + 1]; rows + 1];
for r in (0..rows).rev() {
for c in (0..cols).rev() {
apples[r][c] = (pizza[r].as_bytes()[c] == b'A') as i32 + apples[r + 1][c] + apples[r][c + 1] - apples[r + 1][c + 1];
}
}
let mut dp = vec![vec![vec![-1; k as usize]; cols]; rows];
fn dfs(r: usize, c: usize, cuts: usize, apples: &Vec<Vec<i32>>, dp: &mut Vec<Vec<Vec<i32>>>, rows: usize, cols: usize, k: usize, mod_val: i32) -> i32 {
if apples[r][c] == 0 { return 0; }
if cuts == 0 { return 1; }
if dp[r][c][cuts] != -1 { return dp[r][c][cuts]; }
let mut ans = 0;
for nr in r + 1..rows {
if apples[r][c] - apples[nr][c] > 0 {
ans = (ans + dfs(nr, c, cuts - 1, apples, dp, rows, cols, k, mod_val)) % mod_val;
}
}
for nc in c + 1..cols {
if apples[r][c] - apples[r][nc] > 0 {
ans = (ans + dfs(r, nc, cuts - 1, apples, dp, rows, cols, k, mod_val)) % mod_val;
}
}
dp[r][c][cuts] = ans;
ans
}
dfs(0, 0, (k - 1) as usize, &apples, &mut dp, rows, cols, k as usize, mod_val)
}
}
|