题目
解法:
Weekly Contest 289的题目,自己感觉有点变态,当时没做出来
这道题需要解决一下几个问题:
- 如何数trailing zero
- 如何枚举这些符合条件形状的所有可能性
第一个问题最优解是,所有的0都只可能是2*5得到,所以可以把每个位置数字分解,记录每个数字以2为因子和以5为因子的个数。可以通过一个形状能组成多少个2,5的pair来得到多少个0。由于要累计这些个数,所以使用prefixsum技巧
枚举这些形状可能性最好操作的方案是把每个位置作为形状的turning point,这样就可以每个位置穷举四种组合即可。可以验证即使当前位置在第一行或者第一列(可能会有方向无法组成有效的形状),最后的答案也不会有问题
class Solution:
def maxTrailingZeros(self, grid: List[List[int]]) -> int:
# helper function to get the number of factors of 2 and 5 in a number
def helper(num,f):
if num % f != 0:
return 0
return 1 + helper(num // f,f)
m,n = len(grid),len(grid[0])
# left represents the rowwise left to right prefix sum of factor of 2 and 5 numbers
left = [[[0,0] for _ in range(n)] for _ in range(m)]
# top represents the columnwise top to down prefix sum of factor of 2 and 5 numbers
top =