网上面经里看到的题目
有0和1组成的数组,求数组中只包含0的连续子数组有多少个?
输入:[0 0 1 0]
输出:4
算法
动态规划
状态f[i]表示数组中以i结尾的子数组中,只包含0的子数组个数;
状态计算:
1.如果输入的nums[i] == 1,那么f[i] = f[i - 1];
2.否则f[i] = f[i - 1] + nums中以i结尾的连续0的长度。
代码
nums = list(map(int, input().split()))
f = [0] * len(nums)
cnt = 0
if nums[0] == 0:
f[0] = 1
cnt = 1
for i in range(1, len(nums)):
if nums[i] == 1:
f[i] = f[i - 1]
cnt = 0
else:
cnt += 1
f[i] = f[i - 1] + cnt
print(f[-1])
应该没问题吧?
还有面经里把这种情况推广到了二维,求只包含0的子矩阵的个数,不太会,有大佬知道出处嘛~
只需要统计每个连续子段中全是0的个数是多少,假设是x,答案加x*(x+1)/2