2023-07-11 リコウの毎日の質問

リンク:

https://leetcode.cn/problems/maximum-alternating-subsequence-sum/

タイトルの意味:

配列を指定して、このサブシーケンスの奇数ビットと偶数ビットの合計を最大化するサブシーケンスを見つけます(添え字が 1 から始まる場合 | とにかく、最初の数値は + です)

ほどく:

下り坂を見つけます。曲がり角にある 2 つのサブ下り坂が 1 つの合計下り坂よりも大きいです (図に示すように)。

ここに画像の説明を挿入

実際のコード:

考え:

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
typedef long long int ll;
const int Nmax=1E5+7;
long long maxAlternatingSum(vector<int>& nums)
{
    ll ans=0;bool zt=1;int temp=nums[0];
    
    for(int i=1;i<nums.size();i++)
    {
      
        if(zt && nums[i]<nums[i-1]) zt=0;
        
        if(!zt && nums[i]>nums[i-1])
        {
            ans+=temp-nums[i-1];
            zt=1;temp=nums[i];
        }
        
        temp=max(temp,nums[i]);
    }
    return ans+temp;
}
int main()
{
    vector<int> nums;
    int n;cin>>n;
    
    for(int f=1;f<=n;f++)
    {
        int temp;cin>>temp;
        nums.push_back(temp);
    }
    
    ll ans=maxAlternatingSum(nums);
    cout<<ans<<endl;
}

DP?:

#include<bits/stdc++.h>
#include<iostream>
using namespace std;
typedef long long int ll;
const int Nmax=1E5+7;
long long maxAlternatingSum(vector<int>& nums)
{
    ll A1=0,A2=0;//最后一位+ 最后一位- 
    
    int lg=nums.size();
    for(int i=0;i<lg;i++)
    {
        A1=max(A2+nums[i],A1);
        if(i!=0) A2=max(A1-nums[i],A2); 
    }
    return max(A1,A2);
}
int main()
{
    vector<int> nums;
    int n;cin>>n;
    
    for(int f=1;f<=n;f++)
    {
        int temp;cin>>temp;
        nums.push_back(temp);
    }
    
    ll ans=maxAlternatingSum(nums);
    cout<<ans<<endl;
}

制限:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 105

おすすめ

転載: blog.csdn.net/Fei_WuYan/article/details/131688470