1、题目描述
输入数组,返回最长的子序列,使得子序列相邻两数之差是正负交替的。
2、思路
动归
dp1[i]记录以第i个数字结尾的满足条件的最长子序列长度,且第i个元素比序列中的前一个元素大;
dp2[i]记录以第i个数字结尾的满足条件的最长子序列长度,且第i个元素比序列中的前一个元素小。
3、代码
int wiggleMaxLength(vector<int>& nums) {
int n = nums.size();
if(n<2) return n;
int dp1[n],dp2[n];
int ans = 0;
dp1[0]=1;dp2[0]=1;
for(int i=1;i<n;i++){
dp1[i]=1;
int m = 0;
for(int j=0;j<i;j++){
if(nums[i]>nums[j]){
m=max(m,dp2[j]);
}
}
dp1[i]+=m;
dp2[i]=1;
m = 0;
for(int j=0;j<i;j++){
if(nums[i]<nums[j]){
m=max(m,dp1[j]);
}
}
dp2[i]+=m;
ans=max(ans,max(dp2[i],dp1[i]));
}
return ans;
}