[dp]Leetcode.376.摆动序列
状态的定义:dp[i]
代表以下标为i
结尾的最大摆动序列
因为这里涉及到正负还有0
所以使用up[i]
存的是目前为止最长的以第 i
个元素结尾的上升摆动序列的长度。
类似的, down[i]
记录的是目前为止最长的以第 i
个元素结尾的下降摆动序列的长度。
我们每当找到将第 i
个元素作为上升摆动序列的尾部的时候就更新 up[i]
。现在我们考虑如何更新 up[i]
,我们需要考虑前面所有的降序结尾摆动序列,也就是找到 down[j]
,满足 j < i
且 nums[i]>nums[j]
。类似的, down[i]
也会被更新。
/**
* dp[i] 的意义是以下标i结尾的最长摆动序列
*/
class Solution {
public int wiggleMaxLength(int[] nums) {
if (nums.length <= 1) return nums.length;
int n = nums.length;
int[] up = new int[n];
int[] down = new int[n];
for (int i = 1; i < n; i++) {
for (int j = i - 1; j >= 0; j--) {
if(nums[i] - nums[j] > 0){
up[i] = Math.max(up[i],down[j] + 1);
}else if (nums[i] < nums[j])
down[i] = Math.max(down[i],up[j] + 1);
}
}
return 1 + Math.max(down[nums.length - 1], up[nums.length - 1]);
}
public static void main(String[] args) {
int[] nums = {1,2,3,4,5,6,7,8,9};
System.out.println(new Solution().wiggleMaxLength(nums));//2
}
}