从题目的例子来看,可以不太严谨的归纳出,属于正的部分都是给定nums序列中上升子序列的最后一位,属于负的部分都是给定nums序列中下降子序列的最后一位。从逻辑推导的角度来看,我们无论如何会选择一个数字作为最终子序列的开头,如果这个数字处于一个上升序列且位置是i,那这个上升序列中的任何i+j位置的数字都比i位置的数字大,且排列在后,两个数字相减为负。所以我们只能选择最后上升序列最后一位;如果i 位数字其处于下降序列中,则为了最后结果大,我们需要选择最大的数字,也就是i必须是下降序列的开头。开头的数字确定好之后,就是第二位数字了,需要减去的数字自然越小越好,而如果第一个数字是上升序列最后一位,之后是下降序列,则选择下降序列最后一个,如果开头数字是下降序列第一个,同理,第二个数字还是选择下降序列最后一个。于是奇偶位置的数字交替进行。直到最后一位。上升则加入,下降,则不取。
class Solution:
def maxAlternatingSum(self, nums: List[int]) -> int:
#dp[i][j]: the maxmum array we have for the i and j
n = len(nums)
if n == 1:return nums[0]
pos = 0
res = 0
while True:
while pos < n - 1 and nums[pos+1] > nums[pos]:
pos += 1
res += nums[pos]
if pos == n - 1:
break
pos += 1
while pos < n - 1 and nums[pos+1] <= nums[pos]:
pos += 1
if pos == n - 1:
break
res -= nums[pos]
return res