1444.Number of Ways of Cutting a Pizza === ###### tags: `Hard`,`Array`,`Matrix`,`DP` [1444. Number of Ways of Cutting a Pizza](https://leetcode.com/problems/number-of-ways-of-cutting-a-pizza/) ### 題目描述 Given a rectangular pizza represented as a `rows x cols` matrix containing the following characters: `'A'` (an apple) and `'.'` (empty cell) and given the integer `k`. You have to cut the pizza into `k` pieces using `k-1` cuts. For each cut you choose the direction: vertical or horizontal, then you choose a cut position at the cell boundary and cut the pizza into two pieces. If you cut the pizza vertically, give the left part of the pizza to a person. If you cut the pizza horizontally, give the upper part of the pizza to a person. Give the last piece of pizza to the last person. *Return the number of ways of cutting the pizza such that each piece contains **at least** one apple*. Since the answer can be a huge number, return this modulo 10^9^ + 7. ### 範例 **Example 1:** ![](https://assets.leetcode.com/uploads/2020/04/23/ways_to_cut_apple_1.png =80%x) ``` Input: pizza = ["A..","AAA","..."], k = 3 Output: 3 Explanation: The figure above shows the three ways to cut the pizza. Note that pieces must contain at least one apple. ``` **Example 2:** ``` Input: pizza = ["A..","AA.","..."], k = 3 Output: 1 ``` **Example 3:** ``` Input: pizza = ["A..","A..","..."], k = 1 Output: 1 ``` **Constraints**: * 1 <= `rows`, `cols` <= 50 * `rows` == `pizza.length` * `cols` == `pizza[i].length` * 1 <= `k` <= 10 * `pizza` consists of characters `'A'` and `'.'` only. ### 解答 #### Python ```python= class Solution: def ways(self, pizza: List[str], k: int) -> int: rows, cols = len(pizza), len(pizza[0]) @cache def has_apple(up, left, bottom, right): return any(any(pizza[r][c] == 'A' for c in range(left, right)) for r in range(up, bottom)) @cache def dp(up, left, k): if k == 1: if has_apple(up, left, rows, cols): return 1 count = 0 for r in range(up, rows): if has_apple(up, left, r+1, cols): count += dp(r+1, left, k-1) for c in range(left, cols): if has_apple(up, left, rows, c+1): count += dp(up, c+1, k-1) return count return dp(0, 0, k) % (10 ** 9 + 7) ``` > [name=Yen-Chi Chen][time=Fri, Mar 31, 2023] ### Reference [回到題目列表](https://hackmd.io/@Marsgoat/leetcode_every_day)