class Solution: def ways(self, pizza: List[str], k: int) -> int: MOD = 10**9 + 7 m, n = len(pizza), len(pizza[0]) # 二维前缀和,prefix[i][j] 表示以 (i,j) 为左上角到右下角的苹果数 # 用后缀的方式:suffix[r][c] = 从 (r,c) 到 (m-1,n-1) 的苹果数 suffix = [[0] * (n + 1) for _ in range(m + 1)] for r in range(m - 1, -1, -1): for c in range(n - 1, -1, -1): suffix[r][c] = (suffix[r + 1][c] + suffix[r][c + 1] - suffix[r + 1][c + 1]) if pizza[r][c] == 'A': suffix[r][c] += 1 # hasApple[r1][c1][r2][c2] 检查 (r1,c1) 到 (r2,c2) 是否有苹果 # 优化:用函数判断 def has_apple(r, c, nr, nc): """(r,c) 到 (nr,nc) 是否有苹果,nc=n-1 表示到右边界""" total = (suffix[r][c] - suffix[nr + 1][c] - suffix[r][nc + 1] + suffix[nr + 1][nc + 1]) return total > 0 dp = [[[0] * (k + 1) for _ in range(n)] for _ in range(m)] # 初始化 p = 1 for r in range(m - 1, -1, -1): for c in range(n - 1, -1, -1): if suffix[r][c] > 0: dp[r][c][1] = 1 for p in range(2, k + 1): for r in range(m - 1, -1, -1): for c in range(n - 1, -1, -1): # 水平切 for nr in range(r, m - 1): if has_apple(r, c, nr, n - 1): dp[r][c][p] = (dp[r][c][p] + dp[nr + 1][c][p - 1]) % MOD # 垂直切 for nc in range(c, n - 1): if has_apple(r, c, m - 1, nc): dp[r][c][p] = (dp[r][c][p] + dp[r][nc + 1][p - 1]) % MOD return dp[0][0][k]