2786. Visit Array Positions to Maximize Score
Description
You are given a 0-indexed integer array nums and a positive integer x.
You are initially at position 0 in the array and you can visit other positions according to the following rules:
- If you are currently in position
i, then you can move to any positionjsuch thati < j. - For each position
ithat you visit, you get a score ofnums[i]. - If you move from a position
ito a positionjand the parities ofnums[i]andnums[j]differ, then you lose a score ofx.
Return the maximum total score you can get.
Note that initially you have nums[0] points.
Example 1:
Input: nums = [2,3,6,1,9,2], x = 5 Output: 13 Explanation: We can visit the following positions in the array: 0 -> 2 -> 3 -> 4. The corresponding values are 2, 6, 1 and 9. Since the integers 6 and 1 have different parities, the move 2 -> 3 will make you lose a score of x = 5. The total score will be: 2 + 6 + 1 + 9 - 5 = 13.
Example 2:
Input: nums = [2,4,6,8], x = 3 Output: 20 Explanation: All the integers in the array have the same parities, so we can visit all of them without losing any score. The total score is: 2 + 4 + 6 + 8 = 20.
Constraints:
2 <= nums.length <= 1051 <= nums[i], x <= 106
Solutions
Solution 1: Dynamic Programming
Based on the problem description, we can draw the following conclusions:
- Moving from position \(i\) to position \(j\), if \(nums[i]\) and \(nums[j]\) have different parities, then \(x\) points will be lost;
- Moving from position \(i\) to position \(j\), if \(nums[i]\) and \(nums[j]\) have the same parity, then no points will be lost.
Therefore, we can use an array \(f\) of length \(2\) to represent the maximum score when the current position's parity is \(0\) and \(1\). Initially, the values of \(f\) are \(-\infty\), and then we initialize \(f[nums[0] \& 1] = nums[0]\), indicating the score at the initial position.
Next, we start traversing the array \(nums\) from position \(1\). For each position \(i\) corresponding to the value \(v\), we update the value of \(f[v \& 1]\) to be the larger value between \(f[v \& 1]\) and \(f[v \& 1 \oplus 1] - x\) plus \(v\), i.e., \(f[v \& 1] = \max(f[v \& 1], f[v \& 1 \oplus 1] - x) + v\).
The answer is the larger value between \(f[0]\) and \(f[1]\).
The time complexity is \(O(n)\), where \(n\) is the length of the array \(nums\). The space complexity is \(O(1)\).
1 2 3 4 5 6 7 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 | |