【每日一題】3250. 單調陣列對的數目 I

xiaoxinlong發表於2024-11-28

題目:

給你一個長度為 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

相關文章