连续相同的数不算是摆动序列
单独一个或不相等的两个数算是摆动序列
1.状态表示
是什么?dp表中里的值所表示的含义就是状态表示
dp[i]表示:以i位置为结尾的所有子序列中,最长的摆动序列的长度
但是i位置的值可能是下降后的,也可能是上升后的,所以细分为两种状态表示
f[i]表示:以i位置为结尾的所有子序列中,最后一个位置呈现“上升”趋势最长的摆动序列的长度
f[i]表示:以i位置为结尾的所有子序列中,最后一个位置呈现“下降”趋势最长的摆动序列的长度
2.状态转移方程
dp[i] 等于什么
根据子序列长度不同,可分为两种情况:1.长度为1 2.长度大于1
因为一个位置到i位置是上升趋势的,所以到i位置的前一个位置一定是下降的,所以刚好就是状态表示的g表,j表示子序列i位置的前一个位置(可能有很多),要找到最大的然后+1
g表同理:
3.初始化
保证填表的时候不越界
f表和g表全部初始化为1,这样就不用考虑长度为1的情况了
4.填表顺序
为了填写当前状态的时候,所需要的状态已经计算过了
从左往右,两个表一起填
5.返回值
题目要求+状态表
两个表里的最大值
6.代码
class Solution {
public:
int wiggleMaxLength(vector<int>& nums) {
int n = nums.size();
//1.创建dp表
//2.初始化
vector<int> f(n,1);
vector<int> g(n,1);
//3.填表
int ret = 1;
for(int i = 1; i < n;i++)
{
for(int j = 0; j < i;j++)
{
if(nums[i]> nums[j])
{
f[i] = max(g[j]+1,f[i]);
}
else if(nums[i] < nums[j])
{
g[i] = max(f[j] + 1,g[i]);
}
}
ret = max(ret, max(f[i],g[i]));
}
//4.返回值
return ret;
}
};