Maximum Alternating Subsequence Sum

medium dp greedy

Problem

Pick a subsequence to maximize (sub[0] − sub[1] + sub[2] − …).

Inputnums = [4,2,5,3]
Output7
Pick 4,2,5,3 → 4−2+5−3 = 4? Actually pick 4 and 3 → 4+3−... ; best is 5: optimal subsequence [5,3] gives 5; or [4,2,5,3] gives 4−2+5−3=4. Best is 7 by picking [4,2,5] → 4−2+5=7.

def max_alternating_sum(nums):
    even = 0  # last picked at even index
    odd = 0   # last picked at odd index
    for x in nums:
        even, odd = max(even, odd + x), max(odd, even - x)
    return even
function maxAlternatingSum(nums) {
  let even = 0, odd = 0;
  for (const x of nums) {
    const ne = Math.max(even, odd + x), no = Math.max(odd, even - x);
    even = ne; odd = no;
  }
  return even;
}
class Solution {
    public long maxAlternatingSum(int[] nums) {
        long even = 0, odd = 0;
        for (int x : nums) {
            long ne = Math.max(even, odd + x), no = Math.max(odd, even - x);
            even = ne; odd = no;
        }
        return even;
    }
}
long long maxAlternatingSum(vector<int>& nums) {
    long long even = 0, odd = 0;
    for (int x : nums) {
        long long ne = max(even, odd + (long long) x), no = max(odd, even - (long long) x);
        even = ne; odd = no;
    }
    return even;
}
Time: O(n) Space: O(1)