2786. 访问数组中的位置使分数最大
思路:动态规划dp。假设现在我们最后跳的一个点为i,那么我们需要知道区间[0,i-1]中:成立的最后一跳nums[j]为偶数的最大得分、成立的最后一跳nums[j]为奇数的最大得分。这样我们就可以更新nums[i]所对应的奇数还是偶数的最大得分。
class Solution {
public:
long long maxScore(vector<int>& nums, int x) {
int n=nums.size();
//a[0]表示最后一跳为偶数的最大得分
//a[1]表示最后一跳为奇数的最大得分
//初始化为一个非常大的负数,表示不符合的情况
long long a[2]={LONG_LONG_MIN/2,LONG_LONG_MIN/2};
a[nums[0]%2]=nums[0];
long long mx=nums[0];
for(int i=1;i<n;i++){
//上一跳为相同奇偶性
a[nums[i]%2]+=nums[i];
//上一跳为不相同奇偶性
a[nums[i]%2]=max(a[nums[i]%2],a[(nums[i]%2+1)%2]+nums[i]-x);
mx=max(mx,a[nums[i]%2]);
}
return mx;
}
};