Given an integer array nums and an integer k, return the maximum sum of a non-empty subsequence of that array such that for every two consecutive integers in the subsequence, nums[i] and nums[j], where i < j, the condition j - i <= k is satisfied.
A subsequence of an array is obtained by deleting some number of elements (can be zero) from the array, leaving the remaining elements in their original order.
Example 1:
Input: nums = [10,2,-10,5,20], k = 2
Output: 37
Explanation: The subsequence is [10, 2, 5, 20].
Example 2:
Input: nums = [-1,-2,-3], k = 1
Output: -1
Explanation: The subsequence must be non-empty, so we choose the largest number.
Example 3:
Input: nums = [10,-2,-10,-5,20], k = 2
Output: 23
Explanation: The subsequence is [10, -2, -5, 20].
Constraints:
1 <= k <= nums.length <= 10^5
-10^4 <= nums[i] <= 10^4
from typing import List
import numpy

class Solution:
  def constrainedSubsetSum(self, nums: List[int], k: int) -> int:

    _len = len(nums)
    dp = numpy.zeros(_len, dtype=int)
    dp[0] = nums[0]
    _deque = []
    result = -sys.maxsize
    for i in range(_len):

      while _deque and i - _deque[0] > k:
        _deque.pop(0)

      tmp = 0
      if _deque:
        tmp = dp[_deque[0]]
      dp[i] = max(nums[i], nums[i] + tmp)
      result = max(result, dp[i])

      while _deque and dp[i] >= dp[_deque[-1]]:
        _deque.pop()

      _deque.append(i)
      pass


    return result

from typing import List
import numpy

class Solution:
  def constrainedSubsetSum(self, nums: List[int], k: int) -> int:

    _len = len(nums)
    dp = numpy.zeros(_len, dtype=int)
    dp[0] = nums[0]
    _deque = []
    result = -sys.maxsize
    for i in range(_len):

      while _deque and i - _deque[0] > k:
        _deque.pop(0)

      tmp = 0
      if _deque:
        tmp = dp[_deque[0]]
      dp[i] = max(nums[i], nums[i] + tmp)
      result = max(result, dp[i])

      while _deque and dp[i] >= dp[_deque[-1]]:
        _deque.pop()

      _deque.append(i)
      pass


    return result
