leetcode-5407-切割披萨的方案数

题目描述:

 

 

 

 

 

 解:动态规划  参考自:

作者:coldme-2
链接:https://leetcode-cn.com/problems/number-of-ways-of-cutting-a-pizza/solution/dong-tai-gui-hua-by-coldme-2-2/
来源:力扣(LeetCode)

class Solution:
    def ways(self, pizza: List[str], k: int) -> int:
        mod = 10**9 + 7
        m, n = len(pizza), len(pizza[0])
        # dp[m][n][k]
        dp = [[[0] * k for j in range(n)] for i in range(m)]

        # nums[i][j]: how many apples in pizza[i:][j:]
        nums = [[False] * n for i in range(m)]
        for i in range(m-1, -1, -1):
            for j in range(n - 1, -1, -1):
                hasApple = pizza[i][j] == "A"
                if i == m - 1 and j == n - 1:
                    nums[i][j] = hasApple
                elif i == m - 1:
                    nums[i][j] =  hasApple + nums[i][j + 1]
                elif j == n - 1:
                    nums[i][j] =  hasApple + nums[i + 1][j]
                else:
                    nums[i][j] =  hasApple + nums[i + 1][j] + nums[i][j + 1] - nums[i + 1][j + 1]

        # dp[i][j][p] = sum(dp[x][j][p] for x in [i+1,m-1]) + sum(dp[i][y][p] for y in [j+1, n-1])
        for i in range(m-1, -1, -1):
            for j in range(n-1, -1, -1):
                if nums[i][j]:
                    dp[i][j][0] = 1
                for p in range(1, k):
                    for x in range(i+1, m):
                        if nums[i][j] - nums[x][j]:
                            dp[i][j][p] += dp[x][j][p-1] % mod
                    for y in range(j+1, n):
                        if nums[i][j] - nums[i][y]:
                            dp[i][j][p] += dp[i][y][p-1] % mod
        return dp[0][0][k-1] % mod

 

posted @ 2020-05-10 21:30  oldby  阅读(193)  评论(0编辑  收藏  举报