/** * [1696] Jump Game VI */ pub struct Solution {} // submission codes start here use std::collections::VecDeque; impl Solution { pub fn max_result(nums: Vec, k: i32) -> i32 { let n = nums.len(); let k = k as usize; let mut dp = vec![0;n]; let mut queue = VecDeque::new(); dp[0] = nums[0]; queue.push_back(0); for i in 1..n { while let Some(h) = queue.front() { if i - *h > k { queue.pop_front(); } else { break; } } dp[i] = dp[*queue.front().unwrap()] + nums[i]; while let Some(tail) = queue.back() { if dp[*tail] <= dp[i] { queue.pop_back(); } else { break; } } queue.push_back(i); } dp[n - 1] } } // submission codes end #[cfg(test)] mod tests { use super::*; #[test] fn test_1696() { assert_eq!(Solution::max_result(vec![1,-1,-2,4,-7,3], 2), 7); assert_eq!(Solution::max_result(vec![10,-5,-2,4,0,3], 3), 17); assert_eq!(Solution::max_result(vec![1,-5,-20,4,-1,3,-6,-3], 2), 0); } }