1444. 切披萨的方案数
给你一个 rows x cols 大小的矩形披萨和一个整数 k ,矩形包含两种字符: 'A' (表示苹果)和 '.' (表示空白格子)。你需要切披萨 k-1 次,得到 k 块披萨并送给别人。
切披萨的每一刀,先要选择是向垂直还是水平方向切,再在矩形的边界上选一个切的位置,将披萨一分为二。如果垂直地切披萨,那么需要把左边的部分送给一个人,如果水平地切,那么需要把上面的部分送给一个人。在切完最后一刀后,需要把剩下来的一块送给最后一个人。
请你返回确保每一块披萨包含 至少 一个苹果的切披萨方案数。由于答案可能是个很大的数字,请你返回它对 10^9 + 7 取余的结果
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/number-of-ways-of-cutting-a-pizza
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
public int ways(String[] pizza, int k) {
int n = pizza.length, m = pizza[0].length(), mod = 1000000007;
int[][][] dp = new int[n + 1][m + 1][k + 1];
int[][] count = new int[n + 1][m + 1];
for (int i = n - 1; i >= 0; i--) {
for (int j = m - 1; j >= 0; j--) {
count[i][j] = (pizza[i].charAt(j) == 'A' ? 1 : 0) + count[i + 1][j] + count[i][j + 1] - count[i + 1][j + 1];
}
}
for (int i = n - 1; i >= 0; i--) {
for (int j = m - 1; j >= 0; j--) {
if (count[i][j] > 0) {
dp[i][j][1] = 1;
for (int p = 2; p <= k; p++) {
for (int x = 1; x <= n - i - 1; x++) {
if (count[i][j] - count[i + x][j] > 0) {
dp[i][j][p] = (dp[i][j][p] + dp[i + x][j][p - 1]) % mod;
}
}
for (int y = 1; y <= m - j - 1; y++) {
if (count[i][j] - count[i][j + y] > 0) {
dp[i][j][p] = (dp[i][j][p] + dp[i][j + y][p - 1]) % mod;
}
}
}
}
}
}
return dp[0][0][k];
}
}
心之所向,素履以往 生如逆旅,一苇以航