1public int maxResult(int[] nums, int k) {
2 int n = nums.length;
3 int[] dp = new int[n];
4 dp[0] = nums[0];
5 Deque<Integer> deque = new LinkedList<>();
6 deque.offer(0);
7
8 for (int i = 1; i < n; i++) {
9 while (!deque.isEmpty() && deque.peek() < i - k) {
10 deque.poll();
11 }
12
13 dp[i] = nums[i] + dp[deque.peek()];
14
15 while (!deque.isEmpty() && dp[i] >= dp[deque.peekLast()]) {
16 deque.pollLast();
17 }
18
19 deque.offer(i);
20 }
21
22 return dp[n - 1];
23}