Skip to content

Commit e5fb641

Browse files
Create 2786. 访问数组中的位置使分数最大.md
1 parent 40417f9 commit e5fb641

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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

Comments
 (0)