leetcoed 1786. 访问数组中的位置使分数最大 练习

题目:


给你一个下标从 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[]分开奇偶记录了前面数据的汇总结果。

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值