1444. 切披萨的方案数

时间:2023-03-21
本文章向大家介绍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];
    }
}

原文地址:https://www.cnblogs.com/tianyiya/p/17238525.html