|
| 1 | +#### 2786. 访问数组中的位置使分数最大 |
| 2 | + |
| 3 | +难度:中等 |
| 4 | + |
| 5 | +--- |
| 6 | + |
| 7 | +给你一个下标从 **0** 开始的整数数组 `nums` 和一个正整数 `x` 。 |
| 8 | + |
| 9 | +你 **一开始** 在数组的位置 `0` 处,你可以按照下述规则访问数组中的其他位置: |
| 10 | + |
| 11 | +* 如果你当前在位置 `i` ,那么你可以移动到满足 `i < j` 的 **任意** 位置 `j` 。 |
| 12 | +* 对于你访问的位置 `i` ,你可以获得分数 `nums[i]` 。 |
| 13 | +* 如果你从位置 `i` 移动到位置 `j` 且 `nums[i]` 和 `nums[j]` 的 **奇偶性** 不同,那么你将失去分数 `x` 。 |
| 14 | + |
| 15 | +请你返回你能得到的 **最大** 得分之和。 |
| 16 | + |
| 17 | + **注意** ,你一开始的分数为 `nums[0]` 。 |
| 18 | + |
| 19 | + **示例 1:** |
| 20 | + |
| 21 | +``` |
| 22 | +输入:nums = [2,3,6,1,9,2], x = 5 |
| 23 | +输出:13 |
| 24 | +解释:我们可以按顺序访问数组中的位置:0 -> 2 -> 3 -> 4 。 |
| 25 | +对应位置的值为 2 ,6 ,1 和 9 。因为 6 和 1 的奇偶性不同,所以下标从 2 -> 3 让你失去 x = 5 分。 |
| 26 | +总得分为:2 + 6 + 1 + 9 - 5 = 13 。 |
| 27 | +``` |
| 28 | + |
| 29 | + **示例 2:** |
| 30 | + |
| 31 | +``` |
| 32 | +输入:nums = [2,4,6,8], x = 3 |
| 33 | +输出:20 |
| 34 | +解释:数组中的所有元素奇偶性都一样,所以我们可以将每个元素都访问一次,而且不会失去任何分数。 |
| 35 | +总得分为:2 + 4 + 6 + 8 = 20 。 |
| 36 | +``` |
| 37 | + |
| 38 | + **提示:** |
| 39 | + |
| 40 | +* `2 <= nums.length <= 10^5` |
| 41 | +* `1 <= nums[i], x <= 10^6` |
| 42 | + |
| 43 | +--- |
| 44 | + |
| 45 | +动态规划: |
| 46 | + |
| 47 | +从左往右遍历的过程中,只取决于最近偶数时和最近奇数时得分的最大值。然后再根据当前值和两个最大值进行比较,取更大者即可。 |
| 48 | + |
| 49 | +```Go |
| 50 | +func maxScore(nums []int, x int) int64 { |
| 51 | + res := int64(nums[0]) |
| 52 | + dp := []int64{math.MinInt32, math.MinInt32} |
| 53 | + dp[nums[0] % 2] = int64(nums[0]) |
| 54 | + for i := 1; i < len(nums); i++ { |
| 55 | + maxn := max(dp[nums[i] % 2], dp[(nums[i] + 1) % 2] - int64(x)) + int64(nums[i]) |
| 56 | + res = max(res, maxn) |
| 57 | + dp[nums[i] % 2] = max(dp[nums[i] % 2], maxn) |
| 58 | + } |
| 59 | + return res |
| 60 | +} |
| 61 | +``` |
0 commit comments