题目:
给你一个下标从 0 开始的整数数组 nums 和一个正整数 x 。
你 一开始 在数组的位置 0 处,你可以按照下述规则访问数组中的其他位置:
如果你当前在位置 i ,那么你可以移动到满足 i < j 的 任意 位置 j 。
对于你访问的位置 i ,你可以获得分数 nums[i] 。
如果你从位置 i 移动到位置 j 且 nums[i] 和 nums[j] 的 奇偶性 不同,那么你将失去分数 x 。
请你返回你能得到的 最大 得分之和。
注意 ,你一开始的分数为 nums[0] 。
示例 1:
输入:nums = [2,3,6,1,9,2], x = 5
输出:13
解释:我们可以按顺序访问数组中的位置:0 -> 2 -> 3 -> 4 。
对应位置的值为 2 ,6 ,1 和 9 。因为 6 和 1 的奇偶性不同,所以下标从 2 -> 3 让你失去 x = 5 分。
总得分为:2 + 6 + 1 + 9 - 5 = 13 。
示例 2:
输入:nums = [2,4,6,8], x = 3
输出:20
解释:数组中的所有元素奇偶性都一样,所以我们可以将每个元素都访问一次,而且不会失去任何分数。
总得分为:2 + 4 + 6 + 8 = 20 。
提示:
2 <= nums.length <= 105
1 <= nums[i], x <= 106
C代码:
long long maxScore(int* nums, int numsSize, int x){
long long res = nums[0];
long long dp[2] = {INT_MIN, INT_MIN}; --- ---
dp[nums[0] % 2] = nums[0];
for (int i = 1; i < numsSize; i++) {
int parity = nums[i] % 2;
long long cur = fmax(dp[parity] + nums[i], dp[1 - parity] - x + nums[i]);
res = fmax(res, cur);
dp[parity] = fmax(dp[parity], cur);
}
return res;
}
解析:
1. `long long maxScore(int* nums, int numsSize, int x){`:这是函数的声明,函数名为`maxScore`,它接受三个参数:一个指向整数数组的指针`nums`,数组的大小`numsSize`,以及一个整数`x`。函数返回一个`long long`类型的值。
2. `long long res = nums[0];`:初始化一个`long long`类型的变量`res`,用来存储可能的最大分数,初始值设为数组的第一个元素。
3. `long long dp[2] = {INT_MIN, INT_MIN};`:声明并初始化一个大小为2的`long long`数组`dp`,用来作为动态规划的状态数组,初始值设为`INT_MIN`,即整数能表示的最小值。
4. `dp[nums[0] % 2] = nums[0];`:根据数组第一个元素的奇偶性,更新`dp`数组。如果第一个元素是偶数,则`dp[0]`更新为该元素的值;如果是奇数,则`dp[1]`更新。
5. `for (int i = 1; i < numsSize; i++) {`:开始一个循环,从数组的第二个元素开始遍历。
6. `int parity = nums[i] % 2;`:计算当前遍历到的元素的奇偶性,存储在变量`parity`中。
7. `long long cur = fmax(dp[parity] + nums[i], dp[1 - parity] - x + nums[i]);`:计算当前元素可以带来的两种可能的最大分数:一种是将当前元素加到与它奇偶性相同的前一个最大分数上;另一种是减去`x`后加到与它奇偶性不同的前一个最大分数上。使用`fmax`函数取两者的最大值,存储在`cur`中。
8. `res = fmax(res, cur);`:更新全局最大分数`res`,如果`cur`更大,则用`cur`的值替换`res`。
9. `dp[parity] = fmax(dp[parity], cur);`:更新`dp`数组中与当前元素奇偶性相同的状态,如果`cur`更大,则用`cur`的值替换`dp[parity]`。
10. `}`:循环结束。
11. `return res;`:函数返回计算得到的全局最大分数。
笔记:
1.fmax
是 C 语言标准库中的一个函数,它定义在 math.h
头文件中。这个函数用于返回两个浮点数中的最大值。
2.NT_MIN
是一个宏定义,它在 C 语言的 limits.h
头文件中定义,表示 int
类型可以表示的最小值。在大多数现代计算机系统中,int
类型是 32 位的,并且是有符号的。
3.该程序妙处在于这条语句parity记录了当前元素的奇偶性,dp[]分开奇偶记录了前面数据的汇总结果。