深圳南山建设局官方网站,中建八局第一建设有限公司中标,庆网站建设,自己开发网站怎么开发目录
动态规划怎么学#xff1f;
1. 题目解析
2. 算法原理
1. 状态表示
2. 状态转移方程
3. 初始化
4. 填表顺序
5. 返回值
3. 代码编写
写在最后#xff1a; 动态规划怎么学#xff1f;
学习一个算法没有捷径#xff0c;更何况是学习动态规划#xff0c;
跟我…目录
动态规划怎么学
1. 题目解析
2. 算法原理
1. 状态表示
2. 状态转移方程
3. 初始化
4. 填表顺序
5. 返回值
3. 代码编写
写在最后 动态规划怎么学
学习一个算法没有捷径更何况是学习动态规划
跟我一起刷动态规划算法题一起学会动态规划
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(vectorint nums) {int n nums.size(), fmax 1, gmax 1;vectorint 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);}
};
写在最后
以上就是本篇文章的内容了感谢你的阅读。
如果感到有所收获的话可以给博主点一个赞哦。
如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~