【学会动态规划】摆动序列(27)

简介: 【学会动态规划】摆动序列(27)

动态规划怎么学?

学习一个算法没有捷径,更何况是学习动态规划,

跟我一起刷动态规划算法题,一起学会动态规划!

1. 题目解析

题目链接:376. 摆动序列 - 力扣(LeetCode)

这道题很好理解,他需要找数字之间的差是一个正数一个负数的交替,

其实我们不用想的这么麻烦,可以把它看成是一个递增递减递增递减交替的一个序列。

然后不要忘记这要找的是子序列,是可以跳着找的。

2. 算法原理

1. 状态表示

dp[ i ] 表示以 i 位置为结尾的所有子序列中,最长的摆动序列的长度。

但是他实际上分为两种情况:

f [ i ] 表示以 i 位置为结尾,最后一个位置呈现 “上升” 趋势的最长摆动序列的长度。

g [ i ] 表示以 i 位置为结尾,最后一个位置呈现 “下降” 趋势的最长摆动序列的长度。

2. 状态转移方程

状态转移方程还是分成两大类:

先从 f [ i ] 开始说起:

f [ i ] 可以自己本身作为一个子序列,长度就是 1

f [ i ] 可以和自己前面的任意一个数一起成为子序列,长度就是 g [ i - 1 ] + 1

这里要注意的是,需要 f [ i - 1 ] < f [ i ]

然后是 g [ i ] :

g [ i ] 可以自己本身作为一个子序列,长度就是 1

g [ i ] 可以和自己前面的任意一个数一起成为子序列,长度就是 f [ i - 1 ] + 1

这里要注意的是,需要 g [ i - 1 ] > g [ i ]

3. 初始化

我们只要都设成 1,就能不用考虑第一种情况。

4. 填表顺序

从左往右。

5. 返回值

返回 f 表 和 g 表中的最大值。

3. 代码编写

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        int n = nums.size(), fmax = 1, gmax = 1;
        vector<int> f(n, 1), g(n, 1);
        for(int i = 1; i < n; i++) {
            for(int j = 0; j < i; j++) {
                if(nums[i] > nums[j]) f[i] = max(f[i], g[j] + 1);
                if(nums[i] < nums[j]) g[i] = max(g[i], f[j] + 1);
            }
            fmax = max(fmax, f[i]);
            gmax = max(gmax, g[i]);
        }
        return max(fmax, gmax);
    }
};

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

相关文章
|
2月前
|
存储 算法
《LeetCode》—— 摆动序列
《LeetCode》—— 摆动序列
|
3月前
|
机器学习/深度学习 算法 测试技术
【动态规划】C++算法:446等差数列划分 II - 子序列
【动态规划】C++算法:446等差数列划分 II - 子序列
|
4月前
|
Java
leetcode-376:摆动序列
leetcode-376:摆动序列
26 0
|
4月前
|
算法 测试技术 C#
【二分查找】LeetCode1970:你能穿过矩阵的最后一天
【二分查找】LeetCode1970:你能穿过矩阵的最后一天
|
5月前
|
机器学习/深度学习 存储 算法
【算法训练-回溯算法 一】【排列问题】全排列、全排列II
【算法训练-回溯算法 一】【排列问题】全排列、全排列II
50 0
|
1月前
|
算法 测试技术 C#
【动态规划】【前缀和】【和式变换】100216. K 个不相交子数组的最大能量值
【动态规划】【前缀和】【和式变换】100216. K 个不相交子数组的最大能量值
|
7月前
|
算法 测试技术
【学会动态规划】最长湍流子数组(23)
【学会动态规划】最长湍流子数组(23)
22 0
|
8月前
【动态规划刷题 13】最长递增子序列&& 摆动序列
【动态规划刷题 13】最长递增子序列&& 摆动序列
|
8月前
|
人工智能
【动态规划刷题 11】等差数列划分&& 最长湍流子数组
【动态规划刷题 11】等差数列划分&& 最长湍流子数组
|
5月前
|
算法 程序员
【算法训练-动态规划 二】【线性DP问题】连续子数组的最大和、乘积最大子数组、最长递增子序列
【算法训练-动态规划 二】【线性DP问题】连续子数组的最大和、乘积最大子数组、最长递增子序列
61 0