-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1444.切披萨的方案数.py
49 lines (46 loc) · 1.62 KB
/
1444.切披萨的方案数.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#
# @lc app=leetcode.cn id=1444 lang=python
#
# [1444] 切披萨的方案数
#
# @lc code=start
class Solution(object):
def ways(self, pizza, k):
"""
:type pizza: List[str]
:type k: int
:rtype: int
"""
nums = [[0]*(len(pizza[0]) +1) for _ in range(len(pizza) + 1)]
for i in range(len(pizza)-1,-1,-1):
for j in range(len(pizza[0])-1,-1,-1):
if pizza[i][j] == 'A':
nums[i][j] = nums[i][j+1] + nums[i+1][j] + 1 - nums[i+1][j+1]
else:
nums[i][j] = nums[i][j+1] + nums[i+1][j] - nums[i+1][j+1]
if nums[0][0] == 0:
return 0
MAX_NUM = 10**9 + 7
#三维dp
dp = [[[0]*(len(pizza[0]) + 1) for _ in range(len(pizza) + 1)] for z in range(k)]
dp[0][0][0] = 1
for i in range(1,k):
for j in range(len(pizza)):
for k in range(len(pizza[0])):
if nums[j][k] <=0:
continue
# 纵切
for z in range(k):
if nums[j][z] - nums[j][k] > 0:
dp[i][j][k] = (dp[i][j][k] + dp[i-1][j][z]) % MAX_NUM
# 横切
for z in range(j):
if nums[z][k] - nums[j][k] > 0:
dp[i][j][k] = (dp[i][j][k] + dp[i-1][z][k]) % MAX_NUM
#print(dp[i])
sum = 0
for i in range(len(pizza)):
for j in range(len(pizza[0])):
sum = (sum + dp[-1][i][j]) % MAX_NUM
return sum
# @lc code=end