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

news2025/1/12 20:05:52

目录

动态规划怎么学?

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(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);
    }
};

写在最后:

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/915404.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优化学习体验是在线培训系统的关键功能

在线培训系统是当今教育领域的一个重要工具&#xff0c;帮助学生和教师提高学习效果和教学质量。一个功能完善的在线培训系统可以提供丰富多样的学习资源和交互方式&#xff0c;以满足不同学生的需求。 个性化学习路径 每个学生的学习需求和进度都不同。通过个性化学习路径功…

【Python机器学习】实验16 卷积、下采样、经典卷积网络

文章目录 卷积、下采样、经典卷积网络1. 对图像进行卷积处理2. 池化3. VGGNET4. 采用预训练的Resnet实现猫狗识别 TensorFlow2.2基本应用5. 使用深度学习进行手写数字识别 卷积、下采样、经典卷积网络 1. 对图像进行卷积处理 import cv2 path data\instance\p67.jpg input_…

AMBA总线协议(7)——AHB(五):传输仲裁

一、前言 在之前的文章中我们讨论了AHB的很多传输细节&#xff0c;主要有控制信号&#xff0c;地址信号的译码&#xff0c;从机的响应等&#xff0c;其中重点介绍了双周期响应&#xff0c;最后介绍了数据总线及端结构&#xff0c;在本文中我们将继续介绍AHB传输的仲裁机制。 仲…

利用大模型反馈故障的解决方案

背景 观测云有两个错误巡检脚本&#xff0c;RUM 错误巡检和 APM 错误巡检&#xff0c;代码均开源。 错误巡检的主要目的是发现新出现的错误消息(error stack)&#xff0c;原有的巡检在上报了相应的事件报告后&#xff0c;只是定位了问题&#xff0c;并没有给出合适的解决方案。…

数据分析实战│价格预测挑战【文末赠书】

文本分析是指对文本信息的表示及特征项的选取&#xff0c;商品文本的描述能够反映特定立场、观点、价值和利益。考虑到网上海量的商品数量&#xff0c;对产品的定价难度很大&#xff0c;因此可以使用商品描述帮助商户定价。比如&#xff0c;服装具有较强的季节性价格趋势&#…

PHP 创业感悟交流平台系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 创业感悟交流平台系统&#xff08;含论坛&#xff09;是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 源码下载&#xff1a; https://download.csdn.…

C++中cin >> str 和 string类的getline(cin, str) 用来读取用户输入的两种不同方式的不同点

C中cin >> str 和 string类的getline(cin, str) 用来读取用户输入的两种不同方式的不同点 在C中&#xff0c;string类是标准库提供的字符串类&#xff0c;它可以帮助我们处理和操作字符串。它在<string>头文件中定义。string类提供了一系列成员函数和操作符&#…

Numpy入门(5)—应用举例

NumPy应用举例 5.1 计算激活函数Sigmoid和ReLU 使用ndarray数组可以很方便的构建数学函数&#xff0c;并利用其底层的矢量计算能力快速实现计算。下面以神经网络中比较常用激活函数Sigmoid和ReLU为例&#xff0c;介绍代码实现过程。 计算Sigmoid激活函数 计算ReLU激活函数 使…

C++ vector模拟实现

建议将vector的模拟实现写在头文件中&#xff0c;测试使用部分写在.cpp文件中 vector是类模板&#xff0c;被封装在命名空间中 部分源码&#xff1a;&#xff08;删除某些内容后&#xff09; vector模拟实现的代码&#xff1a; #include<assert.h> namespace djx {tem…

【Git分支操作---讲解二】

Git分支操作---讲解二 查看分支创建分支切换分支修改分支切换分支合并分支合并分支【冲突】(只会修改主分支不会修改其他分支)什么时候会有冲突&#xff1f; 查看分支 创建分支 切换分支 修改分支 切换分支 合并分支 合并分支【冲突】(只会修改主分支不会修改其他分支) 什么时…

国产精品:讯飞星火最新大模型V2.0

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

FL Studio2023最新版本21.1中文水果音乐编曲工具

虚拟乐器和真实乐器的区别&#xff1f;真实乐器指的是现实中需要乐手演奏的乐器&#xff0c;而虚拟乐器是计算机音乐制作中编曲师使用的数字乐器。FL Studio虚拟乐器插件有哪些&#xff1f;下文将给大家介绍几款FL Studio自带的强大虚拟乐器。 一、虚拟乐器和真实乐器的区别 …

JDK21真的来了:虚拟线程正式发布及十多项新特性!

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

Docker容器与虚拟化技术:Docker-Compose单机编排工具

目录 一、理论 1.Docker-Compose 二、实验 1. Docker Compose 安装部署 2.Docker Compose撰写nginx 镜像 3.Docker Compose撰写tomcat 镜像 三、问题 1.Docker Compose 和 Dockerfile 的区别 四、总结 一、理论 1.Docker-Compose &#xff08;1&#xff09;使用场景…

渗透率超90%!智能座舱赛道迎来「存量」替代升级大周期

智能座舱赛道&#xff0c;正在迎来新一轮芯片替代潮。 相比于智能驾驶领域&#xff0c;座舱主机芯片市场并不「性感」&#xff0c;但巨大的存量替代升级机会&#xff0c;也不容小视。 高工智能汽车研究院监测数据显示&#xff0c;2023年1-6月中国市场&#xff08;不含进出口&am…

通用语言模型蒸馏-GLMD

文章目录 GLMD一、PPT内容论文背景P1 BackgroundP2 Approach 相关知识P3 知识蒸馏P4 语言建模词预测逻辑 方法P5 两阶段词汇预测蒸馏P6P7 词汇压缩 实验结果P8 results 二、论文泛读2.1 论文要解决什么问题&#xff1f;2.2 论文采用了什么方法&#xff1f;2.4 论文达到什么效果…

C++学习笔记---- 引用

1、作用 给变量起别名 基本语法&#xff1a;数据类型 &别名 原名 示例&#xff1a; #include <iostream> using namespace std;int main() {int a 1;int &b a;cout << "a " << a << endl;cout << "b " <…

关于Map的理解

Shuffle中进行了分组聚合,而Reduce对分组聚合后的数据进行重新计算. 切片对应的是MapTask 分区对应的是ReduceTask 也可以通过设定reduce数量来调整分区数 分区规则: 设定为1时, 根本不走自定义分区器,而是Hash 如果分区数大于规则 空 如果分区数小于规则(分区数不为1) 报错 …

《金字塔原理》(表达的逻辑)

前言&#xff1a;在思考和表达上&#xff0c;很多时候显得很混乱&#xff0c;源于不了解结构化思想、表达&#xff0c;如何让话讲得更有逻辑&#xff1f;事做得更有条理&#xff1f;接触到了一本书&#xff1a;《金字塔原理》&#xff0c;通过这本书的学习&#xff0c;希望可以…

数字化营销怎么做?数字化营销系统落地重点一览

如何抓住数字化机遇&#xff0c;企业取得营销突破&#xff1f;如果说数字是一种技术、工具或数据等无形的资源&#xff0c;那么数字化则代表了某种动态的过程、资源和能力&#xff0c;如同企业经营一样始终处于流动的过程之中。当前&#xff0c;由于科技水平的不断发展&#xf…