【状态机DP】力扣2786. 访问数组中的位置使分数最大

给你一个下标从 0 开始的整数数组 nums 和一个正整数 x 。

你 一开始 在数组的位置 0 处,你可以按照下述规则访问数组中的其他位置:

如果你当前在位置 i ,那么你可以移动到满足 i < j 的 任意 位置 j 。

对于你访问的位置 i ,你可以获得分数 numsi

如果你从位置 i 移动到位置 j 且 numsi 和 numsj 的 奇偶性 不同,那么你将失去分数 x 。

请你返回你能得到的 最大 得分之和。

注意 ,你一开始的分数为 nums0

示例 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 。

动态规划

css 复制代码
class Solution {
public:
    long long maxScore(vector<int>& nums, int x) {
        long long res = nums[0];
        int n = nums.size();
        vector<long long> dp(2, INT_MIN);
        dp[nums[0]%2] = nums[0];
        for(int i = 1; i < n; i++){
            int k = nums[i] % 2;
            long long cur = max(dp[k] + nums[i], dp[1-k] + nums[i] - x);
            res = max(res, cur);
            dp[k] = cur;
        }
        return res;
    }
};

时间复杂度:O(n),其中 n 是数组 nums 的长度。

空间复杂度:O(1)。

对于这道题目,我们可以定义一个容量为2的dp数组来说明他的奇偶性,并储存最后移动的元素为偶数时得分的最大值和最后移动的元素为奇数时得分的最大值。

在访问位置i的时候,假设i是奇数,则最大的dp1有可能是从上一个最大dp1加上当前numsi转移而来,或者是从上一个最大dp0加上numsi减去x转移而来,由于numsi在题目中大于0,则cur无论如何都会比之前的dp1要大。

然后我们通过res来记录最大的得分情况,并在循环最后,更新dp1为cur。以上是以奇数举例,偶数同理。

相关推荐
8Qi82 分钟前
LeetCode 236. 二叉树的最近公共祖先(LCA)
算法·leetcode·二叉树·递归·lca·后序遍历
兰令水5 分钟前
leecodecode【二叉树排序+最近公共祖先】【2026.6.2打卡-java版本】
java·数据结构·算法·leetcode
人道领域5 分钟前
【LeetCode刷题日记】77&&216.回溯算法剪枝优化在组合问题中的应用
java·算法·leetcode
Deepoch8 分钟前
Deepoc数学大模型:以低幻觉特性护航半导体精准设计与制造
大数据·人工智能·算法·半导体·deepoc
诸葛务农8 分钟前
共沸脱水技术及其在光刻胶用PGMEA纯化中的应用(上)
java·数据库·算法
£suPerpanda10 分钟前
AtCoder Beginner Contest 453
c++·算法
圣保罗的大教堂14 分钟前
leetcode 3633. 最早完成陆地和水上游乐设施的时间 I 简单
leetcode
词元Max19 分钟前
4.2 决策树与随机森林
算法·决策树·随机森林
菜菜的顾清寒27 分钟前
力扣HOT100(51) 动态规划-单词拆分
算法·leetcode·动态规划
风筝在晴天搁浅35 分钟前
剑指Offer LCR 143.子结构判断
算法