【每日一题】3250. 单调数组对的数目 I

 题目:

给你一个长度为 n 的 正 整数数组 nums 。

如果两个 非负 整数数组 (arr1, arr2) 满足以下条件,我们称它们是 单调 数组对:

  • 两个数组的长度都是 n 。
  • arr1 是单调 非递减 的,换句话说 arr1[0] <= arr1[1] <= ... <= arr1[n - 1] 。
  • arr2 是单调 非递增 的,换句话说 arr2[0] >= arr2[1] >= ... >= arr2[n - 1] 。
  • 对于所有的 0 <= i <= n - 1 都有 arr1[i] + arr2[i] == nums[i] 。

请你返回所有 单调 数组对的数目。

由于答案可能很大,请你将它对 109 + 7 取余 后返回。

   

class Solution:
    def countOfPairs(self, nums: List[int]) -> int:
        MOD = 1000000007
        n = len(nums)
        
        # 定义dfs(i,j)表示arr1[i]=j时填充前i-1个位置的数组对总数
        @cache
        def dfs(i, j):
            # 边界情况
            if i == 0:
                return 1
            res = 0
            # 当前nums[i-1]=k的最大范围
            max_k = min(nums[i - 1], min(j, nums[i - 1] - nums[i] + j))
            for k in range(max_k + 1):
                res += dfs(i - 1, k)
                res %= MOD
            return res
        
        Sum = 0
        # 枚举nums[n-1]所有可能填充的值
        for j in range(nums[n - 1] + 1):
            Sum += dfs(n - 1, j)
            Sum %= MOD
        return Sum

 

 

请登录后发表评论

    没有回复内容