
连续相同的数不算是摆动序列
单独一个或不相等的两个数算是摆动序列
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;
    }
}; 
                


















