求一个序列的最大摇摆子序列的长度

方法:动态规划

思路:结尾的那个数字很重要。
注意:状态定义:以 nums[i] 结尾的摆动序列的最长子序列的长度。

dp[i][0] 表示以 nums[i] 结尾的数字是严格上升的
dp[i][1] 表示以 nums[i] 结尾的数字是严格下降的

// 状态转移方程:只看结尾和前一个数的关系
// 初始化:dp[0][0] = 1,dp[0][1] = 1

// 这是比较容易想到的
// dp[i][0] = dp[i - 1][1] + 1, if nums[i] - nums[i - 1] > 0
// dp[i][1] = dp[i - 1][0] + 1, if nums[i] - nums[i - 1] < 0

// 分析到这里,知道需要分类讨论

// 输出:拉通看最大值

思路

  • 按照题目中给出的例子找出规律
  • 如果我们要得出摇摆子序列的最大长度,面对小部分递增或者递减的子序列,我们应该保留它们的头和尾,中间的部分不要,这是贪心算法的应用,下面以题目中给出的例子为例:

[1,17,5,10,13,15,10,5,16,8]

[5,10,13,15] 是原序列的一个递增子序列,我们保留 5 是因为 5 在原序列中与它的前一位 17 以及之前的 1 可以构成摇摆序列,**如果我们选 10 ,那么这个 10 与在 [5,10,13,15] 之后的 10 就不能构成摇摆子序列了,因此,我们希望我们能保留的这个值越大,则保留的这个值与递增序列后面的那 1 个值构成摇摆序列的可能性就越大,这里就体现了贪心 **;

  • 在具体实现的时候,我们可以根据示例画出简单的状态机,那么编码起来逻辑就很清晰了,这一点是必须要掌握的。