双周赛20230427

第三/四题3130. 找出所有稳定的二进制数组 II

题目大意:给定三个正整数 zero、one 和 limit,定义一个二进制数组 arr,要求满足以下条件:数组中 0 出现的次数为 zero,1 出现的次数为 one,并且数组中每个长度超过 limit 的子数组都同时包含 0 和 1。求稳定二进制数组的总数目。

实现思路:这是一个典型的动态规划问题。我们可以使用递归函数 dfs(i, j, k) 来表示以 i 个 0 和 j 个 1 开头,并且最后一个元素为 k 的稳定二进制数组的个数。其中,k 取值为 0 或 1,表示最后一个元素为 0 或 1。递归的边界条件是当 i 或 j 为 0 时,返回 1 或 0,表示当前情况下有 1 个或 0 个稳定数组。在递归过程中,我们需要考虑当前元素添加为 0 或 1 时的情况,并且根据 limit 来控制子数组的长度,避免不稳定的情况。最后,我们可以通过递归计算得到所有满足条件的稳定二进制数组的个数,并取模返回。

class Solution:
    def numberOfStableArrays(self, zero: int, one: int, limit: int) -> int:
        mod = int(1e9)+7
        @cache
        def dfs(i, j, k):
            if i==0:
                return 1 if k==1 and j<=limit else 0
            if j==0:
                return 1 if k==0 and i<=limit else 0

            if k==0:
                return ( dfs(i-1, j, 0) + dfs(i-1, j, 1) - (dfs(i-limit-1, j, 1) if i>limit else 0) ) %mod
            else:
                return ( dfs(i, j-1, 0) + dfs(i, j-1, 1) - (dfs(i, j-limit-1, 0) if j>limit else 0) ) %mod

        ans = (dfs(zero, one, 1) + dfs(zero, one, 0))%mod
        dfs.cache_clear()  # 防止爆内存  
        return ans